ホームページ >データベース >mysql チュートリアル >SQL 結合を使用して複数のタグを持つユーザーを効率的に検索するにはどうすればよいですか?

SQL 結合を使用して複数のタグを持つユーザーを効率的に検索するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-23 17:30:14875ブラウズ

How to Efficiently Find Users with Multiple Tags Using SQL Joins?

結合内の複数の行に条件を適用するための SQL

問題:

「tag1」の両方を所有するユーザーを決定する「IN」を使用する効果を回避しながら、「tag2」タグと「tag2」タグを使用すると、ユーザーに次のいずれかを返します。 tag.

解決策:

テーブル B の 2 つの行条件に基づいてテーブル A から行を選択するには、次のいずれかの方法を選択します:

1.異なる行のテスト:

  • EXISTS 句: 条件に一致するテーブル B の行の存在を検証します。
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')
  • サブクエリ: の行に基づいて一致します。 table B.
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') 
  • JOINs: テーブル B と複数回結合して行を集計します。
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.集計行:

  • COUNTs: テーブル B が重複タグから保護されている場合に適しています。
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
  • 文字列処理 (標準 SQL ではない): タグを文字列に連結します。
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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。