MySQL Multiple Left加入可能的空记录

时间:2014-08-28 05:18:56

标签: php mysql sql join multiple-tables

所以我第一次进入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为空。现在,用户可以分成任意数量的这些组,因此每个用户可能会或可能不会在任何或所有这些表中都有记录。 我假设我只是使用了错误的加入。任何向正确方向的推动都将非常感激。

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

3 个答案:

答案 0 :(得分:2)

更简单的方法是使用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的回答here

和文档here

答案 1 :(得分:1)

如果我理解您正在寻找的内容,那么您的查询几乎是正确的。您只是错过了检查组字段是否为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

希望这会对你有所帮助。

答案 2 :(得分:0)

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