我用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>
但是结果和想象的不太一样。谢谢你帮助我!
如果你想要用户有参数
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