首页 文章

未返回group_concat为null值的行

提问于
浏览
2

我有以下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将停止返回该行 . 关于我做错了什么的任何想法?

3 回答

  • 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
    

    But this is not the solution at all! 我们需要的是"convoluted"加入 -

    So please check this SQL Fiddle: http://www.sqlfiddle.com/#!2/54c6f/3/0

  • 2

    尝试使用LEFT JOIN而不是INNER JOIN

  • 3

    试试这个 -

    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 .

相关问题