首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >只有当我的sql where语句中的所有条件都满足时才能获得结果

只有当我的sql where语句中的所有条件都满足时才能获得结果
EN

Stack Overflow用户
提问于 2020-07-31 10:56:28
回答 1查看 76关注 0票数 0

我真的在与这种情况作斗争。

我有一个由症状和疾病组成的表,对于每个疾病,我有n个症状,现在,我希望SQL仅在where子句上的所有症状id满足一种疾病的所有症状时才检索疾病id。

让我用一个例子来解释一下。让你看看我想做什么。

代码语言:javascript
运行
复制
|         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

代码语言:javascript
运行
复制
SELECT disease_id
FROM compose
WHERE symptom_id = 5
AND
symptom_id = 9
AND
symptom_id = 28;

但是这个SQL返回一个空集,我真的不明白为什么,这听起来并不难,但老实说,我看不出有什么问题。欢迎任何帮助。谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-07-31 10:59:28

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

代码语言:javascript
运行
复制
SELECT disease_id
FROM compose
WHERE symptom_id IN (5, 9, 28)
GROUP BY disease_id
HAVING COUNT(DISTINCT symptom_id) = 3;

如果您想独占匹配3且仅匹配3个症状,那么我们需要对查询稍作修改:

代码语言:javascript
运行
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63185124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档