1. ホーム
  2. mysql

[解決済み] MySQLのwhere節を使ったjoin

2022-04-28 18:36:15

質問

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

私は、categories テーブルにあるすべてのカテゴリと、category_subscriptions テーブルにあるユーザーが購読しているすべてのカテゴリが欲しいのです。

基本的にこれが私のクエリです。

SELECT *
FROM categories
LEFT JOIN user_category_subscriptions 
     ON user_category_subscriptions.category_id = categories.category_id

これは問題なく動作しますが、クエリの最後にwhere句を追加して、本質的にinner/equi joinにしたいのです。

   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 テーブルの両方のキーです。

感謝

解決方法は?

の中に入れる必要があります。 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 のみであるのに対し categories には、この特定のユーザが購読している情報が含まれます。 user_category_subscriptions カラムを使用します。もちろん、他のすべての categories が入力されます。 null の中に user_category_subscriptions カラムを使用します。

逆に where 節は結合を行い では は行セットを縮小します。つまり、これはすべての結合を行い、そして、以下のような行をすべて削除します。 user_id とは等しくない。 1 . という非効率的な方法が残されています。 inner join .

これが役立つといいのですが