MySQL の where 句を使用した結合 質問する

MySQL の where 句を使用した結合 質問する

結合したいテーブルが 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に節を置くことは同等です。しかし、 では、それらは大きく異なります。joinwhereouter join

条件としてjoin、テーブルに結合する行セットを指定します。つまり、user_id = 1最初に を評価し、 のサブセットuser_category_subscriptionsを で取得しuser_id1のすべての行に結合しますcategories。これにより のすべての行が得られますcategoriesが、categoriesこの特定のユーザーがサブスクライブしている のみに列に情報が含まれますuser_category_subscriptions。もちろん、他のすべての は列にcategoriesで設定されます。nulluser_category_subscriptions

逆に、where節は結合を行い、それから行セットが縮小されます。つまり、これはすべての結合を実行し、 とuser_id等しくないすべての行を削除します1。 を取得するための非効率的な方法が残りますinner join

これがお役に立てば幸いです!

おすすめ記事