我已经在一些主题中搜索了如何解决这个问题,我正在使用一个使用CONCAT但仍然必须返回组的查询,即使concat为null并且我找到了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,目前发生的是它确实打印了这两个组,但忽略了所有其他组,因为它们没有命令。 / p>
以下是输出示例:
Admin - add, del, announce
Member - find
期望的输出:
Admin - add, del, announce
Member - find
Banned
OhterGroup1
OhterGroup2
OhterGroup3
OhterGroup4
OhterGroup5
如果您需要有关表格的更多信息,请在此处提供以下示例: MySQL query for multiple tables being secondary tables multiple items?
答案 0 :(得分:2)
尝试使用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