问题描述
|
仍然围绕sql和PHP展开讨论,但希望有人可以提供帮助:
我有以下表格:
1。
user table
- id
- name
- email
2。
user_group table
- user_id
- group_id
3。
group table
- id
- group_name
用户表和组表之间存在多对多关系。现在,我正在尝试构建一个浏览用户页面,该页面列出了系统中的所有用户及其所属的组,因此该页面看起来像这样:
Name: John Doe
Groups: football,tennis,swimming
Name: Jane Doe
Groups: hockey,basketball
Name: Jim Doe
Groups: hockey,football,rugby
等等等
为此,我具有以下sql:
SELECT `user`.name,`group`.name
FROM `user`,`user_group`,`group`
WHERE `user`.id = `user_group`.user_id
AND `group`.id = `user_group`.group_id
GROUP BY `user`.id,`group`.id
返回结果如下:
1. John Doe | football
2. John Doe | tennis
3. John Doe | swimming
4. Jane Doe | hockey
5. Jane Doe | basketball
etc. etc.
如您所见,需要对返回的结果进行操作,以产生前面显示的逗号分隔的组,如。
有没有一种简单的方法来获取页面以显示组,以使它们位于MysqL中每个用户的逗号分隔列表中?还是我必须编写PHP代码以遍历结果以查找重复的ID并在页面上生成以逗号分隔的组列表?还是我的方法做错了什么?
非常感谢。
解决方法
有几种选择(按照我的个人喜好顺序)。
不要按用户ID分组,然后遍历结果并使用用户ID作为键来创建多维数组。
使用GROUP_CONCAT,这不是很漂亮。
使用单独的查询来选择所有组+用户,然后进行迭代以创建多维数组。
, 如果多对多用户表中已经有一个连接表,则在用户表中没有“ 6”是没有意义的。
我猜想从PHP使用MySQL,因此在这种情况下可以使用GROUP_CONCAT。
无论如何,您正在查询一个层次结构,该结构不能优雅地扩展到单个表,因此您将始终必须进行一些PHP编码才能使层次结构恢复原状。
, 尝试
GROUP_CONCAT
和INNER JOIN
SELECT user.name,GROUP_CONCAT(group.name) FROM user
INNER JOIN user_group ON user.id = user_group.user_id
INNER JOIN group ON group.id = user_group.group_id
GROUP BY user.name
, 你真幸运。 MySQL有一个非常方便的聚合运算符“ 10”,它使您可以将分组结果折叠为单行。在您的情况下,它将如下所示:
SELECT
`user`.name,GROUP_CONCAT(`group`.group_name)
FROM `user`
INNER JOIN `user_group` ON (`user_group`.user_id = `user`.user_id)
INNER JOIN `group` ON (`group`.group_id = `user_group`.group_id)
GROUP BY `user`.name
, 这将与您的表结构匹配:)
SELECT `user`.name,GROUP_CONCAT( `group`.group_name )
FROM `user`
INNER JOIN `user_group` ON ( `user_group`.user_id = `user`.id )
INNER JOIN `group` ON ( `group`.id = `user_group`.group_id )
GROUP BY `user`.name
HTH :)