mysql - 如何通过 sql 对多对多的结果进行分组,而不是使用 php 来进行分组?

标签 mysql sql join

“项目”和“参与者”之间存在多对多关系。一个项目可以有多个参与者,一个参与者可以有多个项目。假设 John 有 3 个项目。当我使用 join 执行 sql 时,我得到 3 行,Johns 的每个项目一行。虽然这是我想要的数据,但在 View (MVC) 中,我只想显示 John 1 次,并且 Johns 项目的 View 上有一个字段,我想在其中显示所有 3 个 johns 项目。有没有一种 sql 方法可以将这些项目捆绑在一起,或者我是否必须使用类似于以下的逻辑来做到这一点:

pseudo-code 
userid=null;  //to make sure that i am grouping only one users' projects
projectname = null;  //will be appended to in each iteration of loop
foreach( row_in_resultset as row )
{

   projectname += " " + row->projectname;
   if( this_is_a_different_userid )
   {
      projectname = "";  //reset the project name
   }

}

上面的代码只是一个快速的大脑转储,但希望很清楚,对于每个参与者,我想要一个像这样的 1 个参与者对象的最终结果

participant
{
   name = john smith
   address = 100 foobar street
   projects = paint house, feed cat, do stuff

}

与我目前得到的相反,这是

participant
{
   name = john smith
   address = 100 foobar street
   projects = paint house

}


participant
{
   name = john smith
   address = 100 foobar street
   projects = feed cat

}


participant
{
   name = john smith
   address = 100 foobar street
   projects = do stuff

}

这似乎是一个非常基本的问题,在过去我就已经完成了。但我正在寻找一种可能的更好的方法。

谢谢!

最佳答案

您可以使用 mysql GROUP BY 和 GROUP_CONCAT 方法

SELECT 
    users.username, users.address, 
    GROUP_CONCAT(projects SEPARATOR ', ') AS projects
FROM
    users JOIN projects_to_users 
        ON users.user_id = projects_to_users.user_id
    JOIN projects
        ON projects_to_users.project_id = projects.project_id
GROUP BY
    users.user_id;

希望这能解释它:)

关于mysql - 如何通过 sql 对多对多的结果进行分组,而不是使用 php 来进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9252825/

相关文章:

mysql 数据库版本控制和 pt-online-schema-change

mysql - 是否可以设计一个通用的多对多联结表?

mysql 最大严格模式

mysql - SQL - 根据另一个表中指定的条件限制来自一个表的结果

PHP上传图片什么都不做,没有报错

java - H2数据库中的字符集

sql - 按 Varchar 字段分组

mysql - 从 SQL View 创建 Laravel 模型

MySQL需要返回group by内结果集中的特定记录

mysql - 在 MySql 中,如何将数据插入到引用其他三个表的表中,然后选择该数据?