首页 > 解决方案 > 只有在我的 sql where 语句中满足所有条件时才能得到结果

问题描述

我真的在这种情况下苦苦挣扎。

我有一个由症状和疾病组成的表,对于每种疾病我都有 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 返回一个空集,我真的不明白为什么,这听起来并不难,但老实说我看不出有什么问题。欢迎任何帮助。谢谢

标签: mysqlsql

解决方案


您走在正确的轨道上,但您需要按疾病进行汇总,然后表达您对疾病数量的断言:

SELECT disease_id
FROM compose
WHERE symptom_id IN (5, 9, 28)
GROUP BY disease_id
HAVING COUNT(DISTINCT symptom_id) = 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;

推荐阅读