MYSQL Abfrage 'alle Datensätze aus einer Tabelle die keinen zugehörigen Eintrag in einer anderen Tabelle haben'

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von DianonForce.

    MYSQL Abfrage 'alle Datensätze aus einer Tabelle die keinen zugehörigen Eintrag in einer anderen Tabelle haben'

    Moin, ich brech mir grad einen ab, mit einer Abfrage die ich benötige um fest zu stellen wer eine Infonoch nicht gelesen hat.

    Ich habe 2 Tabellen:

    Ticket_detail
    (beinhaltet zu jeder ticket_id eine unbestimmet Anzahl an detail_id's)
    detail_id
    ticket_id
    info
    ...
    1
    1234
    alles kapput

    2
    1234
    brauche Teile



    und
    ticket_detail_viewed
    (beinhaltet für jeden User der ein ticket_detail gelesen hat einen Datensatz mit seiner ID (viewer) und der zugehörigen dteil_id)
    viewed_id
    ticket_id
    detail_id
    viewer
    1
    1234
    1
    mm
    2
    1234
    2
    mm
    3
    1234
    1
    mx
    4
    1234
    2
    rp

    ich brauche jetzt einen Datensatz mit allen detail_id zu einer bestimmten ticket_id die ein bestimmter viewer noch nicht gelesen hat.

    also z.B.:
    für viewer mx sollte detail_id
    2
    zurückgegeben werden
    für viewer rp die detail_id
    1
    und für viwer mt die detail_id
    1
    2

    vielleicht kann mir einer von euch auf die Sprünge helfen.

    Vielen lieben Dank schonmal.
    "SQL Join" wäre ein Thema das du dir anschauen kannst. Damit geht das.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    aber auch nicht so einfach.
    inner Join findet ja in beiden Tabellen die Datensätze, die einander entsprechen.
    Hier gesucht sind aber Datensätze, wo's in der anneren Tabelle keine Entsprechung zu gibt.

    Also ich würde in eine left-Join-Richtung denken, und dann alle selectieren, wo auffe rechten Seite nix ist.
    Gibt auch noch das (genauen Syntax hab ich nicht im Kopf):
    Select From Where in (Select From Where)
    Select From Where not in (Select From Where)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Moin, danke für die vielen Ansätze, konnte mich nach ca. 300 Druckern installieren endlich mal wieder dran setzen.

    Durch euren Input, bin ich jetzt mit dieser Variante raus

    Quellcode

    1. Select * FROM (SELECT * FROM ticket_detail WHERE ticket_id = 1234) AS a
    2. Left Join (Select * From ticket_viewed WHERE viewer like "rp") as b
    3. ON a.detail_ID = b.detail_ID
    4. WHERE b.detial_id is null;


    Das Ergebnis passt, aber muß das so umständlich, oder denk ich mal wieder zu kompliziert?
    vlt

    SQL-Abfrage

    1. Select * FROM ticket_detail AS a
    2. Left Join (Select * From ticket_viewed WHERE viewer like "rp") as b
    3. ON a.detail_ID = b.detail_ID
    4. WHERE a.ticket_id = 1234 AND b.detial_id is null;
    ungetestet (logischerweise)

    oder gar

    SQL-Abfrage

    1. Select * FROM ticket_detail AS a
    2. Left Join ticket_viewed as b ON a.detail_ID = b.detail_ID
    3. WHERE a.ticket_id = 1234 AND b.detial_id is null AND b.viewer like "rp";

    Mich irritiert, dass du Strings mit " quotest.
    Ist da MySql so tolerant?

    Außerdem ist der Like-Operator Blödsinn, wenn du keine Wildcards verwendest.

    Und wieso geht die zweite Variante nicht?
    Fehlermeldung?
    Oder liegt es nur an deinem Tippfehler?

    Sonst sehe ich keinen Grund, warum das nicht gehen sollte:

    SQL-Abfrage

    1. ​SELECT * FROM ticket_detail AS a
    2. LEFT JOIN ticket_viewed AS b ON a.detail_ID = b.detail_ID
    3. WHERE a.ticket_id = 1234 AND b.detail_id IS NULL AND b.viewer = 'rp'
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Jaein, MYSQL ist da tollerant, aber ansich wars nen übertragungsfehler von mir da ich den SQL Befehl in einem VB Script verwende und dort eigendlich eine Variable drin steht.

    Die Zweite Variante geht nicht, weil sie mir keine Rows zurück gibt. Also nicht das sie Fehlermeldungen zurück geben würde, das Ergebniss bleibt einfach leer. Beide SQL-Abfragen habe ich direkt in der MYSQL-Workbench getestet.