154

我有两个要加入的表。

我想要 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 表中。

谢谢

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,将子句放入 thejoin或 thewhere是等效的。但是,有了outer join,它们就大不相同了。

作为join条件,您指定要加入表的行集。这意味着它user_id = 1首先进行评估,然后将 的子集user_category_subscriptions与 a连接到user_id1的所有行categories。这将为您提供 中的所有行categories,而只有categories该特定用户订阅的 才会在user_category_subscriptions列中包含任何信息。当然,所有其他都将在列categories中填充。nulluser_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 回答