結合したいテーブルが 2 つあります。
カテゴリ テーブル内のすべてのカテゴリと、category_subscriptions テーブル内のユーザーがサブスクライブしているすべてのカテゴリが必要です。
基本的に、これがこれまでの私の質問です:
SELECT *
FROM categories
LEFT JOIN user_category_subscriptions
ON user_category_subscriptions.category_id = categories.category_id
これは問題なく動作しますが、クエリの最後に where 句を追加して、基本的に内部/等価結合にしたいと考えています。
SELECT *
FROM categories
LEFT JOIN user_category_subscriptions
ON user_category_subscriptions.category_id = categories.category_id
WHERE user_category_subscriptions.user_id = 1
1 つのクエリのみを使用して、すべてのカテゴリと特定のユーザーがサブスクライブしているすべてのカテゴリを取得するにはどうすればよいですか?
category_id は、categories テーブルと user_category_subscriptions の両方のキーです。user_id は、user_category_subscriptions テーブルに存在します。
ありがとう
ベストアンサー1
join
それを ではなく 節内に入れる必要がありますwhere
:
SELECT *
FROM categories
LEFT JOIN user_category_subscriptions ON
user_category_subscriptions.category_id = categories.category_id
and user_category_subscriptions.user_id =1
では、またはinner join
に節を置くことは同等です。しかし、 では、それらは大きく異なります。join
where
outer join
条件としてjoin
、テーブルに結合する行セットを指定します。つまり、user_id = 1
最初に を評価し、 のサブセットuser_category_subscriptions
を で取得しuser_id
て1
のすべての行に結合しますcategories
。これにより のすべての行が得られますcategories
が、categories
この特定のユーザーがサブスクライブしている のみに列に情報が含まれますuser_category_subscriptions
。もちろん、他のすべての は列にcategories
で設定されます。null
user_category_subscriptions
逆に、where
節は結合を行い、それから行セットが縮小されます。つまり、これはすべての結合を実行し、 とuser_id
等しくないすべての行を削除します1
。 を取得するための非効率的な方法が残りますinner join
。
これがお役に立てば幸いです!