PHP和MySQL多对多问题

问题描述

| 仍然围绕sqlPHP展开讨论,但希望有人可以提供帮助: 我有以下表格: 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 :)