私は2つのテーブルを持っています:
表「A」:
+----------+
| item_id |
+----------+
| 10 |
| 20 |
| 30 |
| 40 |
+----------+
テーブル「B」:
+----------+-------------+
| item_id | user_id |
+----------+-------------+
| 10 | 1 |
| 10 | 2 |
| 20 | 1 |
| 30 | 2 |
+----------+-------------+
項目「item_id」は共通項目です。
テーブルAからすべての行を選択したい場合ユーザー1とユーザー2の両方が存在します(ただし、一方のみが存在する行は存在しません)。 (私はitem_idが10の結果に1つの行があると考えています)。
回答:
回答№1は4これを試して:
SELECT a.item_id
FROM TABLE_A a
JOIN TABLE_B b ON b.item_id = a.item_id
WHERE b.user_id IN (1, 2)
GROUP BY a.item_id
HAVING COUNT(*) = 2
回答№2については2
もう一つの選択肢:
SELECT A.*
FROM tableA A
INNER JOIN tableB B1 ON B1.item_id = A.item_id AND B1.user_id = 1
INNER JOIN tableB B2 ON B2.item_id = A.item_id AND B2.user_id = 2
1つのユーザーに対して1回、もう1つのユーザーに対してもう一度AをBに2回参加させます。それは、両方のユーザとのアイテムを見つけるために、Bから自分自身への自己結合を述べる別の方法です。
これは、2人のユーザーを超えて拡張することはできません(それぞれ追加の結合が必要です)。
回答№3の場合は0
select item_id from table_b where user_id = 1
intersect
select item_id from table_b where user_id = 2
回答№4の場合は0
SELECT a.item_id FROM a
INNER JOIN b x ON a.item_id = x.item_id
INNER JOIN b y ON x.item_id = y.item_id
AND x.user_id = 1 AND y.user_id = 2;