Как я могу сгруппировать результаты многие-ко-многим через SQL в отличие от использования PHP для этого? - PullRequest
2 голосов
/ 13 февраля 2012

У меня отношения «многие ко многим» между «проектами» и «участниками». Один проект может иметь много участников, и один участник может иметь много проектов. Допустим, у Джона есть 3 проекта. Когда я выполняю sql с объединением, я получаю 3 строки, по одной строке для каждого из проектов Джона. Хотя это данные, которые мне нужны, в представлении (MVC) я хочу отображать Джона только один раз, а в представлении для проектов Джона есть поле, в котором я хочу отобразить все 3 проекта Джона. Есть ли способ объединить эти проекты в 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

}

Это кажется довольно простым вопросом, и в прошлом я бы уже сделал это уже. Но я ищу возможный лучший путь.

Спасибо!

1 Ответ

2 голосов
/ 13 февраля 2012

Вы можете использовать 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;

Надеюсь, это объясняет это:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...