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
我有 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