如何用SQL查询包含全部指定症状的疾病?
解决“查询具备所有选定症状的疾病”的SQL方案
你的原SQL逻辑存在矛盾:WHERE symptom_disease.id_symptom = 1 AND symptom_disease.id_symptom = 2要求单条关联记录的症状ID同时等于1和2,这显然不可能,所以无法得到结果。以下是两种可行的解决方案:
方案一:分组统计法(灵活适配多症状场景)
通过分组统计疾病关联的目标症状数量,筛选出数量等于选定症状总数的疾病:
SELECT d.id, d.disease FROM disease d JOIN symptom_disease sd ON d.id = sd.dss_id WHERE sd.symp_id IN (1, 2) -- 替换为你选定的症状ID集合 GROUP BY d.id, d.disease HAVING COUNT(DISTINCT sd.symp_id) = 2; -- 数字需与选定症状的数量一致
逻辑说明:
- 用
IN筛选出所有包含目标症状的疾病关联记录 - 按疾病ID和名称分组,统计该疾病关联的不同目标症状数量
- 只有当统计数量等于选定症状总数时,说明该疾病拥有所有选定症状
方案二:多表关联法(适合少量症状场景)
针对每个选定症状,单独关联一次关联表,确保疾病同时匹配所有症状:
SELECT d.id, d.disease FROM disease d JOIN symptom_disease sd1 ON d.id = sd1.dss_id AND sd1.symp_id = 1 JOIN symptom_disease sd2 ON d.id = sd2.dss_id AND sd2.symp_id = 2;
逻辑说明:
每一次JOIN都要求疾病关联对应症状,只有同时满足所有JOIN条件的疾病,才会被查询出来,即同时拥有所有选定症状。
内容的提问来源于stack exchange,提问作者Devil Island
相关产品推荐
相关产品推荐

