SQL如何实现同一字段同时匹配两个指定值的多对多关联查询?
错误原因
你的查询返回空结果的核心原因是WHERE子句的逻辑矛盾:关联查询生成的每一行结果里,h.name字段只能对应单个爱好值,不可能同时等于Basketball和Football两个互斥的值,条件永远不成立,自然查不到数据。
正确写法
最易维护、扩展性最好的方案是用分组+聚合筛选,逻辑如下:
- 先筛选出匹配任意一个目标爱好的关联记录
- 按用户维度分组
- 统计每个用户匹配到的目标爱好数量,数量等于目标爱好总个数的用户,就是同时满足所有爱好要求的结果
对应SQL代码:
SELECT u.name FROM hobby h INNER JOIN user_hobby uh ON h.id = uh.hobby_id INNER JOIN user u ON u.id = uh.user_id WHERE h.name IN ('Basketball', 'Football') GROUP BY u.id, u.name HAVING COUNT(DISTINCT h.id) = 2;
如果后续需要筛选同时具备3个及以上指定爱好的用户,只需要在IN列表里补充对应的爱好名称,同时把HAVING子句里的数字改成对应爱好的总数量即可,不需要调整整体语句结构。
你也可以通过多次关联表的方式实现需求,但这种写法每新增一个筛选爱好就要多写一次JOIN逻辑,维护成本很高,不推荐使用,示例如下:
SELECT u.name FROM user u INNER JOIN user_hobby uh1 ON u.id = uh1.user_id INNER JOIN hobby h1 ON uh1.hobby_id = h1.id AND h1.name = 'Basketball' INNER JOIN user_hobby uh2 ON u.id = uh2.user_id INNER JOIN hobby h2 ON uh2.hobby_id = h2.id AND h2.name = 'Football';
内容的提问来源于stack exchange,提问作者Sportello
相关产品推荐
相关产品推荐

