Mysql Left Join(一对多关系)

Mysql Left Join (1 to many relationship)

我有 2 table 一个用户被分配到 1 个组一个组可以有超过 1 个用户

table一个6个用户(ID, Name, GroupID) 除了 1,所有用户都分配到一个组 Table b 4 组(ID, GroupName)

即使没有分配用户,我也想列出所有组和每个组中的用户

SELECT groups.Group_ID, groups.Group_name,
       Group_concat(users.User_ID order by User_ID) AS assigned
FROM groups
LEFT JOIN users 
     ON groups.Group_ID = users.GroupID
GROUP BY groups.Group_ID

这只是 returns 组列表。

如果您在结果集中的 assigned 列中只得到 NULL 值,则表明您的 ON groups.Group_ID = users.GroupID 条件从未得到满足。

您可能应该检查表的内容,看看您在 ON 条件下使用的 ID 列是否按照您认为的方式工作。

另外,请注意您使用的是 nonstandard MySQL extension to GROUP BY。这有时会引起混淆。试试 GROUP BY groups.Group_ID, groups.Group_name 看看你的结果是否有所改善。

SELECT groups.Group_ID, groups.Group_name, group_concat(users.User_ID order by user_ID) AS assigned FROM groups, users where groups.Group_ID = users.User_ID OR groups.Group_ID not in ( (select users.User_ID from users) ) GROUP BY groups.Group_ID, groups.Group_name;

| GroupId | GroupName | assigned  |
+---------+-----------+-----------+
|       1 | a         | 1         |
|       2 | b         | 2,3,4,5   |
|       3 | c         | 1,2,3,4,5 |

如果组 'a' 只分配了用户 1,组 'b' 分配了所有其他用户,并且没有用户属于组 'c' 那么你需要做什么得到这个

|       3 | c         | null |

而不是那个

|       3 | c         | 1,2,3,4,5 |

?

我很确定您的问题是您在单列中存储组 ID 列表。您应该修复您的数据结构并拥有一个 UserGroups table,每个用户一行,每个组一行。

有时,我们会被其他人非常糟糕的设计决定所困。在这种情况下,您可以使用 find_in_set():

On find_in_set(g.groupid, u.groupids) > 0