mysql - 只有在我的 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 返回一个空集,我真的不明白为什么,这听起来并不难,但老实说我看不出有什么问题。欢迎任何帮助。谢谢
解决方案
您走在正确的轨道上,但您需要按疾病进行汇总,然后表达您对疾病数量的断言:
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;
推荐阅读
- twilio - Twilio 验证 API Javascript
- c# - 在 mongo 中插入 doc 时 E11000 重复键错误收集
- python - PONYORM 如何通过 where 条件更新记录?
- terraform-provider-aws - 如何使地形资源块有条件
- python - 我需要帮助来了解如何从我的函数中为 If 语句选择单词
- flutter - MissingPluginException(未找到对通道 plugins.flutter.io/connectivity 进行方法检查的实现)
- html - Bootstrap:在移动设备上“拆分”表单文本区域
- sql-server - 如何从 AWS RDS SQL Server 导出表/数据
- javascript - 使用 imagemin 压缩来自纯浏览器(客户端)应用程序的图像
- postgresql - 如何使用需要返回行的 EF Core 执行原始 sql 插入查询?