2011-04-19 31 views
2

我在解決這個問題時遇到了一些困難。我確定有一種解決方法,但我試圖使用單個查詢。我有兩個條件加入兩張桌子。我需要返回所有匹配't_id'的行(即使NULL)。我還需要僅加入匹配'e_id'的數據。如果'e_id'不存在,它應該返回NULL。下面的查詢返回所有我需要的行:如何正確地連接兩個mysql表的條件?

SELECT b.*, ev.* FROM blocks b 
LEFT OUTER JOIN element_values ev ON ev.b_id = b.id 
WHERE t_id = 1; 

+----+------+-----------+-----+------+------+-----------------+ 
| id | t_id | type  | pos | e_id | b_id | value   | 
+----+------+-----------+-----+------+------+-----------------+ 
| 1 | 1 | textinput | 1 | 1 | 1 | this is it edit | 
| 2 | 1 | textinput | 0 | 1 | 2 | what is it  | 
| 5 | 1 | template | 2 | NULL | NULL | NULL   | 
+----+------+-----------+-----+------+------+-----------------+ 

但增加了對「E_ID」將返回準確的數據的另一個條件,但將排除第三行,如果它是NULL(當然)。

SELECT b.*, ev.* FROM blocks b 
LEFT OUTER JOIN element_values ev ON ev.b_id = b.id 
WHERE t_id = 1 AND e_id = 1; 

+----+------+-----------+-----+------+------+-----------------+ 
| id | t_id | type  | pos | e_id | b_id | value   | 
+----+------+-----------+-----+------+------+-----------------+ 
| 1 | 1 | textinput | 1 | 1 | 1 | this is it edit | 
| 2 | 1 | textinput | 0 | 1 | 2 | what is it  | 
+----+------+-----------+-----+------+------+-----------------+ 

我正在尋找一個解決方案,如果'e_id'不存在,所有三行仍然返回。例如,對於最後一個查詢,當我傳遞'e_id = 2'時,該集合將爲空。但是,我需要它仍然返回所有等於't_id'的行。

任何想法都有幫助。

謝謝!

回答

3

您可以使用LEFT JOIN子句中的e_id = 1來獲取所需的行。

查詢更改爲如下:

SELECT b.*, ev.* 
    FROM blocks b LEFT OUTER JOIN element_values ev 
    ON ev.b_id = b.id 
    AND e_id = 1 
WHERE t_id = 1; 
+0

完美。謝謝Cyber​​nate。 – Corey 2011-04-19 19:09:04