2009-08-02 166 views
103

我有两张我想加入的表。MySQL加入where where子句

我希望类别表中的所有类别以及用户在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表中。

感谢

+0

我相信,它被称为“权利加入”如果我没有记错? – 2009-08-02 21:37:34

+0

@TylerCarter你肯定错了:) – 2016-06-19 10:55:20

回答

221

你需要把它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_id1连接到categories中的所有行。这将为您提供categories中的所有行,而只有该特定用户订阅的categories将具有user_category_subscriptions列中的任何信息。当然,所有其他categories将在user_category_subscriptions列中填入null

相反,where子句进行连接,然后,然后减少行集合。所以,这会完成所有连接,然后消除user_id不等于1的所有行。你只剩下一个效率低下的方法来获得inner join

希望这有助于!

+1

+1为辉煌解释的答案。 – simnom 2010-11-18 16:48:36

+1

+1为伟大的答案! – 2011-11-09 22:29:48

+2

很好地提出了问题,很好地把答案!节省了我的时间。非常感谢! – 2013-11-20 16:05:43

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 
+0

如果我仍然使用这段代码得到相同的错误,那么接下来我要查找什么。 – 2015-06-11 09:56:40