我正在尝试搜索具有所有输入标签的所有用户,但是它通过查看同一列来搜索它们。
SELECT u.*, t.* FROM user u
LEFT JOIN user_tags ut ON u.id = ut.user_id
LEFT JOIN tags t ON ut.tag_id = t.id
WHERE t.name = tag1 AND t.name = tag2
我只是通过标签搜索,每个用户必须拥有所有输入的标签,而不仅仅是1.我使用PHP根据输入的值的数量添加另一个AND子句,所以如果有3个值,它将看起来像这样:
SELECT u.*, t.* FROM user u
LEFT JOIN user_tags ut ON u.id = ut.user_id
LEFT JOIN tags t ON ut.tag_id = t.id
WHERE t.name = tag1 AND t.name = tag2 AND t.name = tag3
t.name只包含1个标记名称,而不是逗号分隔值。标签名称通过user_tags表链接到每个用户,其中每个用户标识可以是多个标记ID,如下所示:
user_id | tag_id
40 | 3
40 | 4
41 | 1
41 | 2
41 | 3
我当前的查询没有返回任何内容,因为没有列包含所有3个标记名称。
答案 0 :(得分:1)
你可以这样做。它只会返回包含所有3个标签的用户ID。
SELECT u.id
FROM user u
LEFT JOIN user_tags ut ON u.id = ut.user_id
LEFT JOIN tags t ON ut.tag_id = t.id
GROUP BY u.id
HAVING SUM(CASE WHEN t.name = tag1 THEN 1 ELSE 0 END) > 0
AND SUM(CASE WHEN t.name = tag2 THEN 1 ELSE 0) > 0
AND SUM(CASE WHEN t.name = tag3 THEN 1 ELSE 0) > 0
答案 1 :(得分:1)
最简单的解决方案是:'count'是您要查询的标签数量,因此您只会获得拥有所有指定标签的用户。
SELECT u.*, count(*) as `count`
FROM `user` u
JOIN `user_tags` ut ON ut.`user_id`=u.`id`
JOIN `tags` t ON t.`id`=ut.`tag_id`
WHERE t.`name`='tag1' OR t.`name`='tag2'
GROUP BY u.`id`
HAVING `count` = 2
答案 2 :(得分:0)
让我们使用group_concat ...
SELECT
u.*
FROM
user u
JOIN user_tags ut ON ut.user_id = y.id
JOIN tags t ON t.id = ut.tag_id
WHERE
-- limit only the tags you want
t.name IN ( tag1, tag2, ... )
GROUP BY
u.id
HAVING
GROUP_CONCAT( t.name ORDER BY t.name SEPARATOR ',' ) = 'tag1,tag2,...'
请注意,在having部分中,条件的两侧的标签顺序应该相同