我试图浏览以前问过的问题,但是有很多问题。希望这不是重复我是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
,则显然不正确。
感谢您的帮助!
答案 0 :(得分:1)
这是一种方法:
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
子句。