2010-06-11 84 views
3

我有兩個表。基於兩個表在MySQL中選擇

疾病

----------------------------- 
| ID | NAME    | 
----------------------------- 
| 1 | Disease 1   | 
| 2 | Disease 2   | 
| 3 | Disease 3   | 

diseases_symptoms

----------------------------- 
| DISEASE_ID | SYMPTOM_ID | 
----------------------------- 
| 1   | 1   | 
| 1   | 2   | 
| 1   | 3   | 
| 1   | 4   | 
| 2   | 1   | 
| 2   | 2   | 

我想選擇具有症狀1或2,3或4。

我已經嘗試了所有diseses:

SELECT * 
FROM diseases_symtoms 
WHERE (symptoms = '1' OR symptoms = '2') 
    AND (symptoms = '3' OR symptoms = '4') 

And:

SELECT * 
    FROM diseases_symtoms 
    WHERE symptoms IN ('1','2') 
    AND symptoms IN ('3','4') 

...但它不工作。

回答

1

請記住,SELECT一次只能檢查一行。這兩個查詢的行爲就好像您可以同時檢測13(例如),這是不可能的。

要同時考慮多個行,您可以加入表中的兩個單獨的副本,或者嘗試一個分組這樣的:

SELECT diseases.* 
FROM diseases 
INNER JOIN diseases_symptoms ON (disases_symptoms.disease_id = diseases.disease_id) 
GROUP BY diseases.disease_id 
HAVING SUM(IF(symptoms = 1 OR symptoms = 2, 1, 0) > 0 AND SUM(IF(symptoms = 3 OR symptoms = 4, 1, 0) > 0 
+0

謝謝VoteyDisciple!它完美的作品,但很少編輯: SELECT *病從 疾病 INNER JOIN diseases_symptoms ON(disases_symptoms.disease_id = diseases.disease_id) GROUP BY diseases.disease_id HAVING SUM(IF(症狀= 1或症狀= (AND)(IF(症狀= 3或SYMPTOMS = 4,1,0))> 0 再一次..感謝一下! – Deyan 2010-06-11 13:04:09

+0

哎呦。當然,這是我的想法。我爲後人編輯過。 – VoteyDisciple 2010-06-11 13:16:40

0
SELECT d.* FROM diseases AS d 
INNER JOIN disease_symptoms AS s1 ON s1.DISEASE_ID = d.ID WHERE SYMPTOM_ID IN (1, 2) 
INNER JOIN disease_symptoms AS s2 ON s2.DISEASE_ID = d.ID WHERE SYMPTOM_ID IN (3, 4) 
GROUP BY d.ID 
+0

這不能滿足「1或2和3或4」。 – Salil 2010-06-11 13:01:33

+0

是的,我只是注意到我誤解了這個問題,並且編輯了這個帖子以反映這種情況 – MrZebra 2010-06-11 13:03:38

0

你可以試試...

SELECT DISTINCT * 
    FROM diseases 
    WHERE EXISTS (SELECT * 
         FROM disease_symptoms 
         WHERE disease.disease_id = disease_symptoms.disease_id AND 
          symptom_id IN (1,2)) AND 
      EXISTS (SELECT * 
         FROM disease_symptoms 
         WHERE disease.disease_id = disease_symptoms.disease_id AND 
          symptom_id IN (3,4));