2013-04-17 23 views
0

我有這樣的SQL代碼如何在`JOIN`上使用`WHERE`?

SELECT sites.id, sites.url, GROUP_CONCAT(categories.name,"|",categories.color SEPARATOR ",") AS categories 
     FROM sites 
     LEFT JOIN categories_data ON sites.id = categories_data.sites_id WHERE categories_data.deleted=0 
     LEFT JOIN categories ON categories_data.categories_id = categories.id WHERE categories.deleted=0 
     WHERE sites.deleted=0 GROUP BY sites.id' 

如果返回該錯誤

Database_Exception [ 1064 ]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN categories ON categories_data.categories_id = categories.id WHERE cate' at line 4 [ SELECT sites.id, sites.url, GROUP_CONCAT(categories.name,"|",categories.color SEPARATOR ",") AS categories FROM sites LEFT JOIN categories_data ON sites.id = categories_data.sites_id WHERE categories_data.deleted=0 LEFT JOIN categories ON categories_data.categories_id = categories.id WHERE categories.deleted=0 WHERE sites.deleted=0 GROUP BY sites.id ] 

所以,我怎麼能在JOIN使用WHERE

謝謝。

+0

你不能在'join'上使用'where' –

回答

2

您無法在聯合表的ON子句中添加WHERE子句。有條件的經營者將它們分開(AND/OR),

SELECT sites.id, 
     sites.url, 
     Group_concat(categories.name, '|', categories.color SEPARATOR ',') AS 
     categories 
FROM sites 
     LEFT JOIN categories_data 
       ON sites.id = categories_data.sites_id 
       AND categories_data.deleted = 0     -- <<== HERE 
     LEFT JOIN categories 
       ON categories_data.categories_id = categories.id 
       AND categories.deleted = 0      -- <<== HERE 
WHERE sites.deleted = 0 
GROUP BY sites.id 

爲了進一步獲得更多的知識有關加入,請訪問以下鏈接:

+0

但是,如果我喜歡你的代碼,那麼我不會使用列表類別獲得'NULL'。 .. –

+1

這很正常。在ON子句而不是WHERE子句上添加條件的區別在於,在ON子句上,記錄的過濾發生在它將被連接到另一個表之前,而在WHERE子句中則是過濾發生在所有已定義表的記錄加入之後。 –

+0

好的!再一次非常感謝你 :) –

1

只需使用AND

SELECT sites.id, sites.url, GROUP_CONCAT(categories.name,"|",categories.color SEPARATOR ",") AS categories 
     FROM sites 
     LEFT JOIN categories_data ON sites.id = categories_data.sites_id AND categories_data.deleted=0 
     LEFT JOIN categories ON categories_data.categories_id = categories.id AND categories.deleted=0 
     WHERE sites.deleted=0 GROUP BY sites.id' 
0

我認爲這是上面提到的,但是也可以在WHERE語句中指定所有這些過濾器。這可能是它的樣子。

SELECT sites.id, sites.url, 
    GROUP_CONCAT(categories.name,"|",categories.color SEPARATOR ",") AS categories 

    FROM sites 
    LEFT JOIN categories_data ON sites.id = categories_data.sites_id 
    LEFT JOIN categories ON categories_data.categories_id = categories.id 

    WHERE 
    sites.deleted=0 
    and categories_data.deleted=0 
    and categories.deleted=0 

    GROUP BY sites.id' 

當您遇到錯誤時,在優化速度和負載之前,可能有助於以非常標準的格式嘗試查詢。 SELECT ... FROM ... WHERE ... GROUP BY等