2010-06-11 125 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));