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

myss37ts  于 2023-03-22  发布在  Mysql
关注(0)|答案(1)|浏览(105)

我用MySql 8.0查询一个用户,他的标签都在参数列表中,但我不知道如何编写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;

先谢了!
例如,如果我有一些行:
| 用户标识|标签标识|
| - ------|- ------|
| 1个|1个|
| 1个|第二章|
| 1个|三个|
| 1个|四个|
| 1个|五个|
| 第二章|第二章|
| 第二章|三个|
假设我的参数列表是[2, 3, 4],如果我执行查询Long findUserByTagList(List<Long> tagIdList),预期的答案是1(因为用户id包含参数列表中的所有标记,但用户id 2没有参数列表中的所有标记)。
我尝试使用以下SQL来执行查询(Sping 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>

但是结果和预期的不一样,谢谢你的帮助!

vsdwdz23

vsdwdz231#

如果你想让用户拥有参数234,你可以在SQL中使用WHEREGROUP BYHAVING

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

相关问题