CONCAT возвращает только те строки, которые не равны NULL - PullRequest
1 голос
/ 25 июня 2011

Я искал в нескольких темах, как решить эту проблему, возникшую у меня с запросом, который использует CONCAT, но все же должен возвращать группы, даже если concat равен нулю, и я нашел 2 решения, которые не работают.

Первым решением было использование ISNULL:

#1582 - Incorrect parameter count in the call to native function 'ISNULL'

Вторым было использование IFNULL, который работает частично, он находит не нулевые, но все же не печатает нулевые.

Здесьэто запрос:

  SELECT g.name, IFNULL(GROUP_CONCAT(c.name),'') AS commands
    FROM site_access b
    JOIN groups g ON b.group_id = g.id
    JOIN group_commands gc ON g.id = gc.group_id
    JOIN commands c ON gc.command_id = c.id
   WHERE b.site_id = 1
GROUP BY g.name
ORDER BY g.status ASC

У меня есть 8 site_access, 8 групп и в настоящее время зарегистрированы, и только 2 команды, которые назначены для группы 1 и группы 2, в настоящее время происходит то, что он печатает эти 2 группы, но игнорируетвсе остальные, потому что у них нет команд.

Вот пример вывода:

Admin - add, del, announce
Member - find

Желаемый вывод:

Admin - add, del, announce
Member - find
Banned
OhterGroup1
OhterGroup2
OhterGroup3
OhterGroup4
OhterGroup5

, если вам нужна дополнительная информация отаблицы, здесь есть пример этого: MySQL-запрос для нескольких таблиц, являющихся вторичными таблицами для нескольких элементов?

1 Ответ

2 голосов
/ 25 июня 2011

Попробуйте вместо LEFT JOIN использовать groups_commands.Обратите внимание, как JOIN в commands также было перемещено в этом запросе.

SELECT g.name, IFNULL(GROUP_CONCAT(c.name),'') AS commands
FROM site_access b
    INNER JOIN groups g 
        ON b.group_id = g.id
    LEFT JOIN group_commands gc
        INNER JOIN commands c 
            ON gc.command_id = c.id
        ON g.id = gc.group_id
WHERE b.site_id = 1
GROUP BY g.name
ORDER BY g.status ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...