MySQL分组查询中如何用多AND条件/IN筛选符合组合条件的记录
解决方法:筛选同时满足多条件的user_id和doctor_id组合
先分析你之前SQL的问题:
- 第一条SQL用
AND同时限定question_id=11和question_id=12,同一行数据不可能同时满足两个不同的question_id,因此永远查不到结果。 - 第二条SQL用
IN是匹配任一条件,分组后会包含只满足其中一个条件的组合,而且第二个条件里的answer值写错了,应该是'["Below 30"]'而非'Below 30'。
正确的SQL写法
方法1:分组+COUNT筛选(通用型强)
适合需要同时满足多个条件的场景,逻辑清晰:
SELECT user_id, doctor_id FROM doctor_classification_question_answers WHERE (question_id = 11 AND answer = '["Male"]') OR (question_id = 12 AND answer = '["Below 30"]') GROUP BY user_id, doctor_id HAVING COUNT(DISTINCT question_id) = 2;
- 先筛选出满足两个条件之一的所有行
- 按
user_id和doctor_id分组,HAVING COUNT(DISTINCT question_id)=2确保该组合同时存在两个不同的question_id记录,即同时满足两个条件。
方法2:自连接(适合需要关联更多字段的场景)
SELECT a.user_id, a.doctor_id FROM doctor_classification_question_answers a JOIN doctor_classification_question_answers b ON a.user_id = b.user_id AND a.doctor_id = b.doctor_id WHERE a.question_id = 11 AND a.answer = '["Male"]' AND b.question_id = 12 AND b.answer = '["Below 30"]';
- 通过自连接,把满足第一个条件的表a和满足第二个条件的表b关联,直接得到同时符合两个条件的组合。
多条件组合的通用方案
如果要同时满足3个或更多问题的指定回答,可采用以下思路:
- 扩展分组+COUNT方式:把所有条件放到
WHERE的OR分支里,HAVING后的COUNT值等于条件的总数量(比如3个条件就写COUNT(DISTINCT question_id)=3)。 - 多次自连接:每增加一个条件就多做一次自连接,每个连接的表对应一个独立条件。
内容的提问来源于stack exchange,提问作者Devsi Odedra
相关产品推荐
相关产品推荐

