2016-10-08 1 views
0

Ich habe versucht, durch die zuvor gestellte Frage für mein Problem zu durchsuchen, aber es gibt so viele Fragen. Hoffentlich ist das kein Duplikat, ich bin neu in SQL, versuche also immer noch meinen Kopf darum zu wickeln! BTW, ich benutze MySQL.SQL SELECT (viele-2-viele)

So habe ich zwei Tabellen:

Sickness 
id: 1, name: flu 
id: 2, name: migraine 

Symptom 
id: 1, name: cough 
id: 2, name: headache 

und die Zwischentabelle z:

Sickness2Symptom 
sickness_id: 1, symptom_id: 1 
sickness_id: 1, symptom_id: 2 
sickness_id: 2, symptom_id: 2 

Ich würde eine Abfrage wie die alle Krankheiten aufgeführt, die keine Beziehung zu einem bestimmten Symptome hat.

Also, wenn wir betrachten alle Beziehungen zwischen einem Symptom und Krankheiten erstellt abrufen. Nehmen wir an, das Symptom hat id=1 (cough). Diese Abfrage würde wie folgt aussehen:

 SELECT sickness.* 
    FROM sickness 
    JOIN sickness2symptom 
    ON sickness2symptom.sickness_id = sickness.id 
    JOIN symptom 
    ON symptom.id = sickness2symptom.symptom_id 
    WHERE symptom.id = 1"; 

dass also "flu" zurückkehren würde.

Aber wie würde ich abfragen, um alle Krankheiten zu erhalten, die keine Beziehung zu Symptom mit id 1 haben, in diesem Fall wäre das Ergebnis der Abfrage "migraine"?

Wenn ich nur die WHERE Klausel zu ändern, ist es offensichtlich nicht korrekt.

Danke für jede Hilfe!

Antwort

1

Dies ist eine Methode:

select s.* 
from sickness s 
where not exists (select 1 
        from Sickness2Symptom s2s 
        where s2s.sickness_id = s.id and s2s.symptom_id = 1 
       ); 

Beachten Sie, dass Sie tatsächlich die symptom Tabelle nicht benötigen, weil die Informationen, die Sie in Sickness2Symptom ist benötigen.

where s.id NOT IN (select s2s.sickness_id 
        from Sickness2Symptom s2s 
        where s2s.symptom_id = 1 
       ); 

Oder als LEFT JOIN mit einer WHERE Klausel:

Auch eine not exists Abfrage kann auch als NOT IN ausgedrückt werden.

+0

Vielen Dank! Jetzt, wo ich die Lösung sehe, ist es offensichtlich. Ich habe Dinge in meinem Kopf überkompliziert :) Ich akzeptiere deine Antwort, sobald ich erlaubt bin (ein paar Minuten, bis ich akzeptiere) – Alex

+0

Und Sie brauchen nur die Aliase in der Unterabfrage, um die äußere Abfrage zu referenzieren, die Der Abfrageprozessor übernimmt die aktuelle (innere) Abfragetabelle, sofern nicht explizit auf eine andere Stelle verwiesen wird. So kürzer, mit Standard-Namen wäre: "Wählen Sie * aus Krankheit s, wo nicht existiert (wählen Sie * aus Sickness2Symptom wo sickle_id = s.id und symptom_id = 1)" –