ホームページ >データベース >mysql チュートリアル >SQL 結合を使用して複数のタグを持つユーザーを選択するには?

SQL 結合を使用して複数のタグを持つユーザーを選択するには?

DDD
DDDオリジナル
2024-12-20 05:41:14218ブラウズ

How to Select Users with Multiple Tags Using SQL Joins?

結合内の複数の行に SQL 条件を実装する方法

提示された問題は、結合からの 2 つの特定のタグを持つユーザーの選択を中心に展開します手術。 IN を使用して提供された例では、いずれかのタグを持つユーザーが返されますが、望ましい結果は両方のタグを持つユーザーを取得することです。これを達成するには、ALL キーワードを利用することは不適切です。

解決策

1.異なる行のテスト

  • EXISTS サブクエリ: 複数の行で条件に一致する行の存在を確認します。
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')
  • サブクエリ: 複数の条件に一致するユーザーを選択しますrows.
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: タグ条件ごとに複数の結合を作成します。
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 (データ保護が必要): 両方のタグが存在することを確認するために集計行をカウントします。
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
  • 文字列処理(データベース固有): タグ名を連結し、データベース固有の関数を使用して特定のタグの存在を確認します。
(MySQL Specific)
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 

以上がSQL 結合を使用して複数のタグを持つユーザーを選択するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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