Mysql Left Join(1对多关系)

时间:2016-07-31 17:37:01

标签: mysql left-join

我有2张桌子 用户被分配到1个组,一个组可以有多个用户

表6个用户(ID,Name,GroupID) 除1外,所有用户都被分配到一个组 表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

这只返回组列表。

3 个答案:

答案 0 :(得分:0)

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

你可能应该查看你的桌子'内容,以查看您在ON条件中使用的ID列是否按您认为的方式工作。

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

答案 1 :(得分:0)

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 |

答案 2 :(得分:0)

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

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

On find_in_set(g.groupid, u.groupids) > 0
相关问题