首页 文章

MySQL与where子句连接

提问于
浏览
112

我有两张 table 想加入 .

我想要类别表中的所有类别以及category_subscriptions表中用户订阅的所有类别 .

基本上这是我目前的查询:

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

这工作正常,但我想在查询的末尾添加一个where子句,然后基本上使它成为内部/ equi连接 .

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

如何仅使用一个查询获取特定用户订阅的所有类别以及所有类别?

category_id是类别表和user_category_subscriptions中的键 . user_id驻留在user_category_subscriptions表中 .

谢谢

2 回答

  • 243

    你需要把它放在 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 ,在 joinwhere 中放置一个子句是等效的 . 然而,对于 outer join ,它们是截然不同的 .

    作为 join 条件,您指定要加入表的行集 . 这意味着它首先计算 user_id = 1 ,并将 user_category_subscriptions 的子集与 user_id 1 连接到 categories 中的所有行 . 这将为您提供 categories 中的所有行,而只有此特定用户订阅的 categories 将在 user_category_subscriptions 列中包含任何信息 . 当然,所有其他 categories 将在 user_category_subscriptions 列中填充 null .

    相反, where 子句执行连接,然后减少行集 . 因此,这会完成所有连接,然后消除 user_id 不等于 1 的所有行 . 你得到一个低效的方式来获得 inner join .

    希望这有帮助!

  • 10

    试试这个

    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
    

相关问题