通过查询同一列获取具有所有输入值的所有行

时间:2012-11-20 14:08:07

标签: php mysql relational-database

我正在尝试搜索具有所有输入标签的所有用户,但是它通过查看同一列来搜索它们。

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个标记名称。

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部分中,条件的两侧的标签顺序应该相同