使用GROUP_CONCAT进行LEFT JOIN的奇怪结果

时间:2016-02-02 14:46:15

标签: mysql left-join group-concat

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

我有三个相关的表:将用户链接到设备的表,将用户链接到项目的表和设备表。我暂时离开了这个用户表,以便简单地查询(所以我只是为每个用户从单独的查询中获取查询)。

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

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};

但是,即使使用相同的用户/设备组合,它也会为每个项目包含一行,这需要进行后期处理(我使用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};

然而,现在这样做只返回一行,无论如何,包括NULL行(似乎忽略了LEFT JOIN,它应该只包含包含第一个表中值的行)。它确实包括项目列表,但每个用户只列出一个设备,即使该用户有多个设备。

我认为这可能是我对LEFT JOIN如何使用群组功能的误解,但我无法弄清楚。

1 个答案:

答案 0 :(得分:0)

事实证明,这确实是我对GROUP_CONCAT的误解。事实证明,如果没有相应的GROUP BY,它就无法工作。

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

GROUP BY `devices`.`number`
相关问题