2011-01-06 124 views
2

我有下面的MySQL查詢應該從表a和b(一對多關係)返回記錄,還有從表c返回的任何值的逗號分隔列表。但是,表c中並不總是有記錄(這就是爲什麼我使用LEFT OUTER JOIN將它加入到表a中)。沒有返回空值的行group_concat沒有返回

SELECT `a`.`id` , `a`.`name` , `b`.`id` AS `b_id` , `b`.`name` AS `b_name` , GROUP_CONCAT( `c`.`l_id`) AS `c_ls` 
FROM `a` 
INNER JOIN `b` ON `a`.`b_id` = `b`.`id` 
LEFT OUTER JOIN `c` ON `a`.`id` = `c`.`a_id` 
GROUP BY `a`.`id` 
ORDER BY `a`.`created` DESC 

上述查詢返回1個記錄時它應該返回2.記錄1具有表C 3個匹配的記錄,記錄2具有表C 0匹配的記錄。

查詢返回:

id | name | b_id | b_name | c_ls 
1 | John | 2 | Bla | [BLOB - 3 B] 

如果我刪除GROUP_CONCAT和GROUP_BY條款然後返回2個記錄:

id | name | b_id | b_name | c_ls 
1 | John | 2 | Bla | [BLOB - 3 B] 
2 | Fred | 3 | Blo | [BLOB - NULL] 

看來,如果c_ls爲null,則GROUP_CONCAT被停止排回。任何想法,我做錯了什麼?

回答

5

先前標記爲正確的答案不幸是錯誤的(正如用戶在評論中指出的那樣)。

它必須讀取IFNULL,[不是ISNULL,isnull只需要一個參數並返回一個布爾值]!

IFNULL返回第二放慢參數,如果空:

SELECT `a`.`id` , `a`.`name` , `b`.`id` AS `b_id` , `b`.`name` AS `b_name` , 
IFNULL(GROUP_CONCAT( `c`.`l_id`), '') AS `c_ls` 
FROM `a` 
INNER JOIN `b` ON `a`.`b_id` = `b`.`id` 
LEFT OUTER JOIN `c` ON `a`.`id` = `c`.`a_id` 
GROUP BY `a`.`id` 
ORDER BY `a`.`created` DESC 

但這不是解決辦法了! 我們需要的是一個 「令人費解的」 加入 -

所以,請檢查該SQL小提琴: http://www.sqlfiddle.com/#!2/54c6f/3/0

3

嘗試使用LEFT JOIN而不是INNER JOIN的

2

試試這個 -

SELECT `a`.`id` , `a`.`name` , `b`.`id` AS `b_id` , `b`.`name` AS `b_name` , ISNULL(GROUP_CONCAT( `c`.`l_id`), '') AS `c_ls` 
FROM `a` 
INNER JOIN `b` ON `a`.`b_id` = `b`.`id` 
LEFT OUTER JOIN `c` ON `a`.`id` = `c`.`a_id` 
GROUP BY `a`.`id` 
ORDER BY `a`.`created` DESC 

新增ISNULL檢查GROUP_CONCAT爲空和返回,而不是NULL空白。

+0

謝謝,非常完美! – RichW 2011-01-06 11:54:42