如何通过sql对多对多的结果进行分组,而不是使用php这样做?

时间:2012-02-12 21:27:01

标签: mysql sql join

我在“项目”和“参与者”之间有多对多的关系。一个项目可以有很多参与者,一个参与者可以有很多项目。让我们说约翰有3个项目。当我使用join执行sql时,我得到3行,每个Johns的项目都有一行。虽然这是我想要的数据,但在视图(MVC)中,我只想显示John 1次,并且在Johns的项目视图中有一个字段,我想显示所有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
   }

}

上面的代码只是一个快速的脑转储,但希望很明显,对于每个参与者,我想要一个参与者对象的最终结果,如此

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

}

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

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用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;

希望这能解释它:)