我试着浏览之前问过的问题,但是问题太多了。希望这不是一个复制,我是一个新的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 13: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
复制相似问题