我真的在与这种情况作斗争。
我有一个由症状和疾病组成的表,对于每个疾病,我有n个症状,现在,我希望SQL仅在where子句上的所有症状id满足一种疾病的所有症状时才检索疾病id。
让我用一个例子来解释一下。让你看看我想做什么。
| 13 | 3 |
| 16 | 3 |
| 17 | 3 |
| 18 | 3 |
| 19 | 3 |
| 20 | 3 |
| 21 | 3 |
| 22 | 3 |
| 23 | 3 |
| 24 | 3 |
| 25 | 3 |
| 26 | 3 |
| 5 | 4 |
| 9 | 4 |
| 28 | 4 |
| 5 | 5 |
| 23 | 5 |
上面的图表是症状-疾病表(组成)的一部分,左栏是症状,右栏是疾病。假设我想要id为n°4的疾病,这种疾病只与3个症状(5,9,28)联系在一起,所以我想像这样的SQL
SELECT disease_id
FROM compose
WHERE symptom_id = 5
AND
symptom_id = 9
AND
symptom_id = 28;
但是这个SQL返回一个空集,我真的不明白为什么,这听起来并不难,但老实说,我看不出有什么问题。欢迎任何帮助。谢谢
发布于 2020-07-31 10:59:28
您在正确的轨道上,但您需要按疾病汇总,然后表达您对疾病数量的断言:
SELECT disease_id
FROM compose
WHERE symptom_id IN (5, 9, 28)
GROUP BY disease_id
HAVING COUNT(DISTINCT symptom_id) = 3;
如果您想独占匹配3且仅匹配3个症状,那么我们需要对查询稍作修改:
SELECT disease_id
FROM compose
GROUP BY disease_id
HAVING
SUM(symptom_id = 5) > 0 AND
SUM(symptom_id = 9) > 0 AND
SUM(symptom_id = 28) > 0 AND
SUM(symptom_id NOT IN (5, 9, 28)) = 0;
https://stackoverflow.com/questions/63185124
复制相似问题