我在“项目”和“参与者”之间有多对多的关系。一个项目可以有很多参与者,一个参与者可以有很多项目。让我们说约翰有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
}
这似乎是一个非常基本的问题,而在过去,我本来就已经完成了。但我正在寻找一种更好的方法。
谢谢!
答案 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;
希望这能解释它:)