GROUP_CONCAT 的 LEFT JOIN 的奇怪结果

Strange Results on LEFT JOIN with GROUP_CONCAT

我想为每个用户获取一些属性。每个用户可以拥有多个设备并注册到多个项目,当然反之亦然(因此是多对多的关系)。

我有三个相关的 table:table 将用户链接到设备,table 将用户链接到项目,以及设备 table。我暂时将用户 table 排除在外,以便简化查询(因此我只是对从单独查询中获得的每个用户重复查询)。

我想要的是能够为每个用户和每个 user/device 对显示一个设备列表——一个项目列表。这适用于以下查询:

SELECT `user_devices`.*, `devices`.`id`, `devices`.`type`, `devices`.`number`, `user_projects`.`project_id` AS `projects`
        FROM `user_devices`
        LEFT JOIN `devices` ON `user_devices`.`device_id` = `devices`.`id`
        LEFT JOIN `user_projects` ON `user_devices`.`user_id` = `user_projects`.`user_id`
            AND `user_devices`.`device_id` = `user_projects`.`device_id`
        WHERE `user_devices`.`user_id` = {$user_id};

然而,即使是相同的user/device组合,它也会为每个项目包含一行,这需要post-处理(我正在使用PHP),这很烦人.因此,我决定像这样使用 GROUP_CONCAT

SELECT `user_devices`.*, `devices`.`id`, `devices`.`type`, `devices`.`number`, GROUP_CONCAT(`user_projects`.`project_id`) AS `projects`
        FROM `user_devices`
        LEFT JOIN `devices` ON `user_devices`.`device_id` = `devices`.`id`
        LEFT JOIN `user_projects` ON `user_devices`.`user_id` = `user_projects`.`user_id`
            AND `user_devices`.`device_id` = `user_projects`.`device_id`
        WHERE `user_devices`.`user_id` = {$user_id};

但是,现在所做的是 return 无论如何都只是一行,包括 NULL 行(似乎忽略了应该只接受行的 LEFT JOIN包括第一个 table 中的值)。它确实包含正确的项目列表,但每个用户只列出一个设备,即使该用户有多个设备也是如此。

我想这可能是我对 LEFT JOIN 如何与组函数一起工作的误解,但我想不通。

原来是我对GROUP_CONCAT的误解。事实证明,如果没有相应的 GROUP BY.

它就无法工作

由于在这种情况下逻辑上项目需要按设备显示,因此可以按 devices 分组。number:

GROUP BY `devices`.`number`