不返回具有 null 值的行group_concat

Rows with null value for group_concat not returned

提问人:RichW 提问时间:1/6/2011 最后编辑:OMG PoniesRichW 更新时间:2/24/2013 访问量:13187

问:

我有以下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 会停止返回该行。关于我做错了什么有什么想法吗?

MySQL 数据库

评论


答:

4赞 sshet 1/6/2011 #1

尝试使用 LEFT JOIN 而不是 INNER JOIN

2赞 Sachin Shanbhag 1/6/2011 #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

评论

2赞 sakhunzai 10/14/2011
更好的方法是使用如果查询逻辑允许,而不是coalesce(field_name,'')ISNULL()
1赞 One-One 9/10/2012
这将返回incorrect parameter count in the call to native function 'isnull'
5赞 sebilasse 2/22/2013 #3

不幸的是,之前标记为正确的答案是错误的(正如用户 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 Fiddle:http://www.sqlfiddle.com/#!2/54c6f/3/0