2009-08-02 192 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