所以我第一次进入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字段。
答案 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