ホームページ >データベース >mysql チュートリアル >SQL 結合を使用して複数のタグを持つユーザーを効率的に検索するにはどうすればよいですか?
問題:
「tag1」の両方を所有するユーザーを決定する「IN」を使用する効果を回避しながら、「tag2」タグと「tag2」タグを使用すると、ユーザーに次のいずれかを返します。 tag.
解決策:
テーブル B の 2 つの行条件に基づいてテーブル A から行を選択するには、次のいずれかの方法を選択します:
1.異なる行のテスト:
SELECT * FROM users WHERE EXISTS (SELECT * FROM tags WHERE user_id = users.id AND name ='tag1') AND EXISTS (SELECT * FROM tags WHERE user_id = users.id AND name ='tag2')
SELECT * FROM users WHERE id IN (SELECT user_id FROM tags WHERE name ='tag1') AND id IN (SELECT user_id FROM tags WHERE name ='tag2')
SELECT u.* FROM users u INNER JOIN tags t1 ON u.id = t1.user_id INNER JOIN tags t2 ON u.id = t2.user_id WHERE t1.name = 'tag1' AND t2.name = 'tag2'
2.集計行:
SELECT users.id, users.user_name FROM users INNER JOIN tags ON users.id = tags.user_id WHERE tags.name IN ('tag1', 'tag2') GROUP BY users.id, users.user_name HAVING COUNT(*) = 2
SELECT user.id, users.user_name, GROUP_CONCAT(tags.name) as all_tags FROM users INNER JOIN tags ON users.id = tags.user_id GROUP BY users.id, users.user_name HAVING FIND_IN_SET('tag1', all_tags) > 0 AND FIND_IN_SET('tag2', all_tags) > 0
推奨事項:
最適なスケーラビリティを実現するには、保護されたタグを持つ COUNT の使用、または複数の場合は内部集計の使用を検討してください。タグはユーザーに対して表示できます。
以上がSQL 結合を使用して複数のタグを持つユーザーを効率的に検索するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。