我用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>
但是结果和预期的不一样,谢谢你的帮助!
1条答案
按热度按时间vsdwdz231#
如果你想让用户拥有参数
2
、3
和4
,你可以在SQL中使用WHERE
、GROUP BY
和HAVING
:这将筛选至少具有三个标记之一的用户(在
WHERE
子句中),然后按用户分组,并确保每个用户有三个匹配项。如果您有重复的
(user_id, tag_id)
,则需要distinct
:HAVING
条款中的所有过滤都采用了一种稍微不同的方法(但效率可能较低):