我有以下MySQL查询,它应该从表a和b(一对多关系)返回记录,还有一个逗号分隔列表,其中包含从表c返回的任何值。但是,表c中并不总是有记录(这就是为什么我使用LEFT OUTER JOIN将它连接到表a)。
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会停止返回该行。关于我做错了什么的想法?
答案 0 :(得分:5)
之前标记为正确的答案不幸错误(正如用户desaivv在评论中指出的那样)。
必须读取 IFNULL ,[不是ISNULL,isnull只需要一个参数并返回一个布尔值]!
如果为null,则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
答案 1 :(得分:3)
尝试使用LEFT JOIN而不是INNER JOIN
答案 2 :(得分: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并返回空白而不是NULL
。