/ / MySQLリンクされた行を選択する - sql、mysql

MySQL - リンクされた行の選択 - sql、mysql

私は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;