MySQL 8.0:如何编写WHERE子句查询所有标签均在参数列表的用户
解决方案
你的问题在于原SQL仅筛选出拥有指定列表中任意一个标签的用户,而你需要的是完全包含指定列表所有标签的用户。可以通过分组统计匹配标签的数量来实现:
核心思路
- 先用
WHERE tag_id IN (...)过滤出所有关联到指定标签的记录; - 按
user_id分组,统计每个用户匹配到的标签数量; - 通过
HAVING子句判断统计数量是否等于指定标签列表的长度——相等则说明该用户拥有所有指定标签。
原生MySQL示例(参数为[2,3,4])
SELECT user_id FROM user_tag WHERE tag_id IN (2, 3, 4) GROUP BY user_id HAVING COUNT(DISTINCT tag_id) = 3;
由于表的主键是(user_id, tag_id),不会存在重复标签,所以COUNT(tag_id)也可替代COUNT(DISTINCT tag_id),后者更严谨(防止意外重复数据)。
Spring Boot + MyBatis XML实现
SELECT `user_id` FROM `user_tag` WHERE `tag_id` IN <foreach collection="tagIdList" index="index" item="item" separator="," open="(" close=")"> #{item} </foreach> GROUP BY `user_id` HAVING COUNT(DISTINCT `tag_id`) = #{tagIdList.size}
#{tagIdList.size}会动态获取传入列表的长度,无需硬编码数值;- 执行后会仅返回完全包含所有指定标签的用户(示例中仅user_id=1)。
补充说明
如果需要处理标签列表为空的场景,可以根据业务需求添加分支逻辑:比如返回所有用户,或者返回空结果集。
内容的提问来源于stack exchange,提问作者ZYinNJU
相关产品推荐
相关产品推荐

