You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 8.0:如何编写WHERE子句查询所有标签均在参数列表的用户

解决方案

你的问题在于原SQL仅筛选出拥有指定列表中任意一个标签的用户,而你需要的是完全包含指定列表所有标签的用户。可以通过分组统计匹配标签的数量来实现:

核心思路

  1. 先用WHERE tag_id IN (...)过滤出所有关联到指定标签的记录;
  2. 按user_id分组,统计每个用户匹配到的标签数量;
  3. 通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:05:19