1

入力されたすべてのタグを持つすべてのユーザーを検索しようとしていますが、同じ列を調べて検索しています。

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は次のように複数のタグIDを使用できます。

user_id | tag_id
40      | 3
40      | 4
41      | 1
41      | 2
41      | 3

また、現在のクエリでは3つのタグ名がすべて含まれていないため、何も返されません。

4

3 に答える 3

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 
于 2012-11-20T14:17:58.763 に答える
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
于 2012-11-20T14:37:11.437 に答える
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,...'

持つセクションでは、タグの順序は条件の両側で同じである必要があることに注意してください

于 2012-11-20T14:34:40.373 に答える