Строки с нулевым значением для group_concat не возвращаются - PullRequest
2 голосов
/ 06 января 2011

У меня есть следующий запрос 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 содержит 3 совпадающие записи в таблице c, запись 2 содержит 0 совпадающих записей в таблице c.

Запрос возвращает:

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 голосов
/ 21 февраля 2013

Ответ, ранее помеченный как правильный, к сожалению, неверен (как отметил пользователь в комментарии в комментариях).

Он должен читать 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 голосов
/ 06 января 2011

Попробуйте использовать LEFT JOIN вместо INNER JOIN

2 голосов
/ 06 января 2011

Попробуйте это -

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.

возвращается пустое значение.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...