ホームページ >データベース >mysql チュートリアル >JOINを使用してSQLで「tag1」と「tag2」の両方を持つユーザーを選択する方法は?

JOINを使用してSQLで「tag1」と「tag2」の両方を持つユーザーを選択する方法は?

DDD
DDDオリジナル
2024-12-28 02:08:09797ブラウズ

How to Select Users with Both 'tag1' and 'tag2' in SQL Using JOINs?

SQL JOIN の複数の行にわたる条件

問題: JOIN 内の複数の行に条件を適用して、一致するレコードを取得します。

目的: 両方を持つユーザーを選択します「tag1」タグと「tag2」タグ。

アプリケーション

この問題を解決するには、主に 2 つのアプローチがあります。

1.個々の行のテスト

A.存在します:

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')

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') 

C.結合:

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.行の集約

A.カウント:

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

B.文字列処理:

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 

考慮事項

  • 個々の行のテスト: 小規模なデータセットに適していますが、大量のデータではパフォーマンスが低下する可能性があります。
  • 行の集約: 詳細パフォーマンスの面ではスケーラブルですが、集計内に重複が存在する場合には制限があります。
  • データベース互換性: 文字列処理技術にはデータベース固有の拡張機能が必要な場合があります。

以上がJOINを使用してSQLで「tag1」と「tag2」の両方を持つユーザーを選択する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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