如何在MySQL中根据精确匹配的症状查询对应疾病ID?
嗨,别担心英语的问题,完全能理解你的需求!我来帮你搞定这个MySQL查询的问题。
首先,咱们先明确核心需求:找出恰好只包含你传入的所有症状,没有额外症状的疾病ID。针对多对多的关联表,咱们可以用两种常见的思路来实现:
方法一:用NOT EXISTS排除额外症状
这种方法先筛选出包含所有目标症状的疾病,再排除掉还有其他症状的疾病:
-- 替换括号里的症状ID和数量为你实际传入的内容 SELECT ed.id_enfermedade FROM enfermedades_diagnosticos ed WHERE ed.id_symptom IN (2, 6) -- 这里传入你的症状ID列表 GROUP BY ed.id_enfermedade HAVING COUNT(DISTINCT ed.id_symptom) = 2 -- 这里是传入症状的总数量 AND NOT EXISTS ( -- 检查该疾病是否有不在传入列表里的症状 SELECT 1 FROM enfermedades_diagnosticos ed2 WHERE ed2.id_enfermedade = ed.id_enfermedade AND ed2.id_symptom NOT IN (2, 6) );
方法二:匹配症状总数和目标症状数
这种方法更简洁,直接统计疾病的总症状数,同时统计其中属于目标症状的数量,当两者都等于传入的症状数时,就是我们要的结果:
-- 同样替换症状列表和数量 SELECT ed.id_enfermedade FROM enfermedades_diagnosticos ed GROUP BY ed.id_enfermedade HAVING COUNT(DISTINCT ed.id_symptom) = 7 -- 传入症状的总数量 AND SUM(CASE WHEN ed.id_symptom IN (1,2,3,4,5,6,7) THEN 1 ELSE 0 END) = 7;
对应你的需求场景举例
- 当你传入症状2和6时,把代码里的症状列表改成
(2,6),数量改成2,就能返回恰好只有这两个症状的疾病。 - 传入1-7时,列表改成
(1,2,3,4,5,6,7),数量改成7,就能匹配到ID为6的疾病。 - 传入1-6时,数量设为6,但没有疾病的症状数刚好是6且完全包含这6个,所以会返回空结果,符合你的要求。
小提醒:如果你的表字段名和我假设的不一样(比如症状ID字段不是id_symptom),记得替换成实际的字段名哦!
内容的提问来源于stack exchange,提问作者Álex P.
相关产品推荐
相关产品推荐

