MySQL多个左连接,可能有空记录


MySQL Multiple Left Joins with possible empty records

所以我第一次进入MySQL中的JOIN,我得到了以下设置:

table: user fields: id, name, ...other fields...

和几个"组"表,每个表都有自己独特的数据,就像一样

table: user_group_1 fields: user_id, ...group_1 unique fields...

table: user_group_2 fields: user_id, ...group_2 unique fields...

table: user_group_X fields: user_id, ...group_X unique fields...

我正在尝试做一个类似的查询:

SELECT user.name as name, [...etc...], CONCAT( group_a.data_a,',', group_b.data_b,',', group_c.data_c ) as user_groups FROM user LEFT JOIN user_group_1 as group_a ON group_a.user_id=user.id LEFT JOIN user_group_2 as group_b ON group_b.user_id=user.id LEFT JOIN user_group_3 as group_c ON group_c.user_id=user.id

它可以从我的用户表中收集所有数据,但我的user_groups是空的。现在,一个用户可以分为任意数量的组,因此每个用户可能在任何或所有这些表中都有记录,也可能没有记录。我想我只是使用了错误的Join。如果能朝着正确的方向努力,我们将不胜感激。

EDIT:当我查询用户时,我需要该用户所在的所有group_x.data_x字段的列表。例如,如果我查询user.id=1,并且我知道用户在组2中,但不在组1或3中,我希望看到user_groups包含:group_b.data_b,但我的user_group字段为空。我有意包含额外的逗号(而不是使用CONCAT_WS),因为我需要一种方法来知道user_groups数据来自哪个user_group_x字段。

更简单的方法是使用CONCAT_WS。第一个参数是分隔符,它将插入每个结果之间。如果其中一个字段为NULL,则会跳过该字段,并且不会插入分隔符。

SELECT user.name as name, [...etc...], 
        CONCAT_WS(',', group_a.data_a, group_b.data_b, group_c.data_c ) as user_groups
 FROM user
 LEFT JOIN user_group_1 as group_a ON group_a.user_id=user.id
 LEFT JOIN user_group_2 as group_b ON group_b.user_id=user.id
 LEFT JOIN user_group_3 as group_c ON group_c.user_id=user.id

请点击此处查看@Bilbo的答案。

以及此处的文档。

如果我理解您要查找的内容,那么您的查询几乎是正确的。您只是错过了检查组字段是否为NULL(以避免出现空的[user_groups]列)。以下是固定查询:

SELECT user.name as name, [...etc...],
        CONCAT_WS(','
                ,group_a.data_a
                ,group_b.data_b
                ,group_c.data_c) as user_groups
 FROM user
 LEFT JOIN user_group_1 as group_a ON group_a.user_id=user.id
 LEFT JOIN user_group_2 as group_b ON group_b.user_id=user.id
 LEFT JOIN user_group_3 as group_c ON group_c.user_id=user.id

希望这对你有帮助。

SELECT user.name as name, [...etc...], 
        CONCAT( group_a.data_a,',',
                group_b.data_b,',',
                group_c.data_c ) as user_groups
 FROM user
 INNER JOIN user_group_1 as group_a ON group_a.user_id=user.id
 INNER JOIN user_group_2 as group_b ON group_b.user_id=user.id
 INNER JOIN user_group_3 as group_c ON group_c.user_id=user.id