代码之家  ›  专栏  ›  技术社区  ›  James

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

  •  0
  • James  · 技术社区  · 10 年前

    因此,我第一次接触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。任何朝着正确方向的努力都将受到极大的赞赏。

    编辑:当我查询用户时,我需要该用户所在的所有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字段。

    3 回复  |  直到 10 年前
        1
  •  2
  •   Community skywinder    7 年前

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

        2
  •  1
  •   Joël Salamin    10 年前

    如果我明白你在找什么,你的查询几乎是正确的。您只是错过了检查组字段是否为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
    

    希望这对你有所帮助。

        3
  •  0
  •   NomNomNom    10 年前
    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