入力されたすべてのタグを持つすべてのユーザーを検索しようとしていますが、同じ列を調べて検索しています。
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つのタグ名がすべて含まれていないため、何も返されません。