MySQLはwhere句と結合します


130

結合したい2つのテーブルがあります。

私は、categoryテーブルのすべてのカテゴリと、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は、categoryテーブルとuser_category_subscriptionsの両方のキーです。user_category_subscriptionsテーブルにあるuser_id。

ありがとう


誤解しない限り、これは「右結合」と呼ばれていると思いますか?
タイラーカーター、

@TylerCarter間違いなく間違いです:)
スクーターDaraf

回答:


287

あなたはそれを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。これにより、のすべての行が表示されますがcategoriescategoriesこの特定のユーザーがサブスクライブしているだけがuser_category_subscriptions列に情報を持ちます。もちろん、他のすべては列にcategories入力さnulluser_category_subscriptionsます。

逆に、where句は参加しない、とその後、行セットを削減します。したがって、これはすべての結合を行い、次にuser_idが等しくないすべての行を削除します1。を取得するための非効率的な方法が残っていますinner join

うまくいけば、これが役立ちます!


2
うまく質問を入れて、うまく答えを入れてください!時間を節約できました。どうもありがとう!
Gaurav Phapale 2013年

1
私はあなたをとても
愛しています

一方、ユーザーにクリーンなデータを生成したい場合は、2番目の(どこで)方法がより適切です。それが正しいか ?
vlr 2016年

1
こんにちは、user_category_subscriptions.user_idがnullでチャックできます。Bテーブルにnullを持つAテーブルの詳細IDを取得するには
Veeresh123

@ Veeresh123、テーブルAとは何Bですか?質問を言い換えることができますか?
Istiaque Ahmed 2017

11

これを試して

  SELECT *
    FROM categories
    LEFT JOIN user_category_subscriptions 
         ON user_category_subscriptions.category_id = categories.category_id 
   WHERE user_category_subscriptions.user_id = 1 
          or user_category_subscriptions.user_id is null

このコードを使用しても同じエラーが発生する場合は、次に何を探しますか。
Jack Franzen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.