154

参加したいテーブルが 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 は、category テーブルと user_category_subscriptions の両方のキーです。user_category_subscriptions テーブルにある user_id。

ありがとう

4

2 に答える 2

323

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_id1行に結合することを意味しcategoriesます。これにより、 のすべての行が得られますが、この特定のユーザーが購読しているcategoriesのみが列に情報を持ちます。もちろん、他のすべては列に入力されます。categoriesuser_category_subscriptionscategoriesnulluser_category_subscriptions

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

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

于 2009-08-02T21:40:05.147 に答える
14

これを試して

  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
于 2012-07-09T12:50:07.200 に答える