所以我第一次接触 MySQL 中的 JOIN,我有以下设置:
表:用户
字段:id, name, ...其他字段...
还有几个“组”表,每个表都有自己独特的数据,就像这样
表:user_group_1
字段:user_id,...group_1 唯一字段...
表:user_group_2
字段:user_id,...group_2 唯一字段...
表:user_group_X
字段:user_id,...group_X 唯一字段...
我正在尝试执行与此类似的查询:
SELECT user.name as name, [...etc...],
CONCAT( group_a.data_a,',',
group_b.data_b,',',
group_c.data_c ) 作为 user_groups
来自用户
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_groups 字段为空。 我有意包含额外的逗号(而不是使用 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 的回答 here .
和文档 here .
关于php - MySQL 多重左连接与可能的空记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25541219/