通过许多相关外键进行SQL选择

时间:2019-01-25 13:57:10

标签: mysql sql database select foreign-keys

一开始我想提到的是,我试图搜索类似的问题,但没有找到解决方案。我正在尽最大努力通过从sympthoms表中键入一些id键从数据库中选择疾病。疾病表和Sympthoms表之间的关系是多对多的,其中包含拥有FK字段(disease_id和症状_id)的连接表disease_symptoms

由于我只要求一个ID,所以效果很好:

SELECT * FROM disease JOIN disease_symptoms ON 
   disease.id=disease_symptoms.disease_id where 
   disease_symptoms.symptoms_id=14 ORDER BY 
   `disease`.`probability` DESC 

但是,当我尝试要求提供更多ID时,事实并非如此:

SELECT * FROM disease JOIN disease_symptoms ON 
    disease.id=disease_symptoms.disease_id where 
    disease_symptoms.symptoms_id=14 AND 
    disease_symptoms.symptoms_id=15 ORDER BY 
    `disease`.`probability` DESC 

(我正试图从疾病中选择流感(id = 1),这与感冒的体温升高(id 14)和咳嗽(id 15)有关。)稍后,我想制作带有感冒的复选框。返回匹配疾病。 (php / symfony)。

我在哪里犯错?

预先感谢您:)

3 个答案:

答案 0 :(得分:2)

您的WHERE条件将永远不会返回任何数据。

disease_symptoms.symptoms_id=14 AND disease_symptoms.symptoms_id=15 

symptoms_id不能同时为14和15。

请尝试以下操作。

disease_symptoms.symptoms_id IN (14, 15)

好的,从您的评论中我对您的追求有了更好的了解。试试这个,

SELECT * FROM disease d
  JOIN disease_symptoms ds1 ON d.id = ds1.disease_id
  JOIN disease_symptoms ds2 ON d.id = ds2.disease_id
 WHERE ds1.symptoms_id = 14
   AND ds2.symptoms_id = 15

通过使用别名,您可以将疾病表与diseasse_symptoms表连接两次,对于您感兴趣的每个症状一次。

答案 1 :(得分:2)

您想要同时具有症状14和15的疾病,对吗?因此,您的疾病必须在所有以症状为14的疾病列表中,在要以症状为15的疾病列表中。

可能是:

SELECT * 
FROM disease 
WHERE ID in (select disease_id from disease_symptoms where symptoms_id=14)
and ID in (select disease_id from disease_symptoms where symptoms_id=15)
order by probability DESC 

Example in SQL Fiddle

答案 2 :(得分:0)

Ti.Android.NotificationManager.cancelAll()

您只需要从相反的方向选择关系即可。 这将返回所有具有给定症状的疾病。