如何使用MySQL where子句查询用户的所有标签是否在参数列表中

问题描述 投票:0回答:1

我用MySql 8.0查询一个tags都在参数列表里的用户,但是不知道怎么写

WHERE
子句来查询答案。以下是表格定义:

CREATE TABLE `user_tag`
(
    `user_id` BIGINT UNSIGNED NOT NULL,
    `tag_id`  BIGINT UNSIGNED NOT NULL,
    CONSTRAINT PRIMARY KEY (`user_id`, `tag_id`)
) ENGINE = InnoDB
  CHARSET = utf8mb4
  COLLATE = utf8mb4_general_ci;

提前致谢!

例如,如果我有一些行:

user_id tag_id
1 1
1 2
1 3
1 4
1 5
2 2
2 3

假设我的参数列表是

[2, 3, 4]
,如果我查询
Long findUserByTagList(List<Long> tagIdList)
,预期答案是
1
(因为用户id包含参数列表中的所有标签,但用户id 2没有所有标签参数列表)。

我尝试使用如下SQL查询(Spring Boot + MyBatis):

SELECT DISTINCT `user_id`
FROM `user_tag`
WHERE `tag_id` IN
<foreach collection="tagIdList" index="index" item="item" separator="," open="(" close=")">
    #{item}
</foreach>

但是结果和想象的不太一样。谢谢你帮助我!

mysql sql mybatis
1个回答
0
投票

如果你想要用户有参数

2
3
4
,你可以在SQL中使用
WHERE
GROUP BY
HAVING

select user_id
from user_tag
where tag_id in (2, 3, 4)
group by user_id
having count(*) = 3

这将过滤至少具有三个标签之一的用户(在

WHERE
子句中),然后按用户分组,并确保每个用户具有三个匹配项。

如果你有重复的

(user_id, tag_id)
,那么你需要
distinct

select user_id
from user_tag
where tag_id in (2, 3, 4)
group by user_id
having count(distinct tag_id) = 3

稍微不同的方法在

HAVING
子句中进行所有过滤(但效率可能较低):

select user_id
from user_tag
group by user_id
having max(tag_id = 2) = 1 and max(tag_id = 3) = 1 and max(tag_id = 4) = 1
© www.soinside.com 2019 - 2024. All rights reserved.