所以我第一次进入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