2016-05-13 7 views
0

Ich habe Probleme, herauszufinden, wie mehrere Datensätze mit mehreren Werten ausgewählt werden. Lass mich versuchen, es zu durchbrechen.Wählen Sie mehrere verschiedene Werte aus der Tabelle aus und bewerten Sie sie für eine Übereinstimmung in der Tabelle

Ich habe zwei Tabellen.

Tabelle 1: Krankheiten

enter image description here

Tabelle 2: Symptome

enter image description here

Was ich tun möchte, ist, wenn der Benutzer ein Symptom tritt, wird es die Krankheiten Tabelle durch und finden Sie das passende Symptom, das damit verbunden ist, und dann wird es die Krankheit zurückgeben, die das Symptom gegeben hat.

Dies ist die SQL-Abfrage Ich habe bisher:

select a.diseases_id, a.disease_name 
from diseases a, symtoms b 
where a.diseases_id = b.diseases_id 
and b.symtom_description like '%Cough%' AND b.symtom_description like '%Sore throat%'; 

Das Problem ist jetzt, was diese SQL-Abfrage nichts zurückgibt, aber wenn ich entfernen die AND-Anweisung es gibt alle Krankheiten, die „Husten“ enthalten in ihre Symptome, aber das ist nicht was ich will. Ich sollte in der Lage sein, eine Reihe von Symptomen auszuwählen, und wenn eine Krankheit alle Symptome aufweist und sie übereinstimmen, wird sie die Krankheit zurückgeben. Für die Abfrage, die ich gepostet habe, sollte es "Gastroesophageal Reflux" zurückgeben, da die Krankheiten, die nur Husten und Halsschmerzen enthält.

Kann mir jemand Hinweise geben, wie das funktioniert?

Danke!

Antwort

2

Es gibt keine Zeile, die enthält "Husten" UND "Halsschmerzen", so dass Sie natürlich ein leeres Ergebnis erhalten.

würde ich so etwas wie diese (nicht getestet) versuchen:

select a.diseases_id, a.disease_name, b.symtom_description 
from diseases a, symtoms b 
where a.diseases_id = b.diseases_id 
and (b.symtom_description like '%Cough%' OR b.symtom_description like '%Sore throat%') 
group by a.diseases_id 
having count(a.diseases_id)=2 
+0

Sie sind ein Live-Sparer! Klappt wunderbar. Stört es Sie, nach der Gruppe zu erklären und wie das funktioniert hat? Und wie funktioniert die Zählung? Was ist der Zweck der = 2? –

+1

HAVING ist wie eine WHERE-Klausel für die Aggregation, also wird sie ** nach der Aggregation (WHERE vorher) angewendet. Ich habe die zusätzliche Spalte _b.symtom_description_ verwendet, um sicherzustellen, dass die Aggregation mir für jedes Symptom eine Zeile gibt. Mit _count (a.diseases_id) = 2_ Ich fordere, dass _a.diseases_id_ muss 2 mal existieren, wie Sie 2 Symptome in Ihrer WHERE-Klausel angegeben. Wenn Sie 3 oder etwas anderes als 2 haben, müssen Sie diese Einschränkung natürlich anpassen. – faulix90

1

Die obige Abfrage Join-Anweisung, die unter ansi-konform geschrieben werden könnte mit

SELECT a.diseases_id, a.disease_name, b.symptom_description 
FROM diseases AS a JOIN symptoms AS b 
    ON a.diseases_id = b.diseases_id 
WHERE b.symptom_description like '%Cough%' OR b.sypmtom_description like '%Sore throat%' 
GROUP BY a.diseases_id 
    HAVING COUNT(a.diseases_id) = 2