我试着浏览之前问过的问题,但是问题太多了。希望这不是一个复制,我是一个新的SQL,所以仍然试图包围我的头!顺便说一下,我在用MySQL。
我有两张桌子:
Sickness
id: 1, name: flu
id: 2, name: migraine
Symptom
id: 1, name: cough
id: 2, name: headache
和中间表,例如:
Sickness2Symptom
sickness_id: 1, symptom_id: 1
sickness_id: 1, symptom_id: 2
sickness_id: 2, symptom_id: 2
我想要一个查询,列出与特定症状无关的所有疾病。
所以,如果我们回顾所有症状和疾病之间的关系。假设症状是id=1 (cough)
。该查询如下所示:
SELECT sickness.*
FROM sickness
JOIN sickness2symptom
ON sickness2symptom.sickness_id = sickness.id
JOIN symptom
ON symptom.id = sickness2symptom.symptom_id
WHERE symptom.id = 1";
因此,这将返回"flu"
。
但是我如何查询与id 1
症状无关的所有疾病,在这种情况下,查询的结果将是"migraine"
。
如果我只将WHERE
子句更改为!=1
,显然是不正确的。
谢谢你的帮助!
发布于 2016-10-08 05:07:06
以下是一种方法:
select s.*
from sickness s
where not exists (select 1
from Sickness2Symptom s2s
where s2s.sickness_id = s.id and s2s.symptom_id = 1
);
请注意,您实际上不需要symptom
表,因为您需要的信息在Sickness2Symptom
中。
另外,not exists
查询也可以表示为NOT IN
。
where s.id NOT IN (select s2s.sickness_id
from Sickness2Symptom s2s
where s2s.symptom_id = 1
);
或者是带有LEFT JOIN
子句的WHERE
。
https://stackoverflow.com/questions/39932698
复制相似问题