MySQL与where子句连接

时间:2009-08-02 21:31:55

标签: mysql join where-clause

我想加入两张桌子。

我想要类别表中的所有类别以及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

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

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

感谢

2 个答案:

答案 0 :(得分:255)

您需要将其放在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 joinjoin非常不同。

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

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

希望这有帮助!

答案 1 :(得分: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