Отношение один ко многим MySQL, порядок по трем или более таблицам - PullRequest
0 голосов
/ 21 октября 2011

У меня есть главная таблица с несколькими вспомогательными таблицами, которые имеют отношение один ко многим

Master
Master_ID, Date, Name, Details
1, 02/10/2011, Bob Smith, example text
Changes
Change_ID, Master_ID, Date, Original, New
1, 1, 05/10/2011, test, test2
2, 1, 06/10/2011, chagge, change
Comments
Comment_ID, Master_ID, Date, Text
1, 1, 05/10/2011, test comment
2, 1, 05/10/2011, more comment
3, 1, 06/10/2011, another

Я хочу объединить все три таблицы, а затем использовать PHP для форматирования всего в массив

SELECT `Master`.*,`Changes`.*,`Comments`.* 
FROM Master 
JOIN `Changes` USING(Master_ID), 
JOIN `Comments` USING(Master_ID) 
WHERE `Master`.Master_ID = 1 
ORDER BY `Master`.Master_ID,`Changes`.Change_ID,`Comments`.Comment_ID

Когда я делаю это, он сортируется по главному идентификатору, затем по идентификатору изменения и затем по идентификатору комментария. Однако проблема в том, что я хочу, чтобы он сортировался по отношению к основному идентификатору, а идентификатор комментария сортируется по отношению к идентификатору изменения. Я пробовал несколько разных способов сортировки, но я не могу заставить его делать то, что я хочу, любая помощь будет оценена.

UPDATE Я добавил пример вывода, если вы заметите, что столбец Change_ID находится не в порядке возрастания, поскольку он отсортирован по идентификатору Change_ID, а не по Master_ID

Master_ID   Date    Name    Details Change_ID   Master_ID   Date    Original    New Comment_ID  Master_ID   Date    Act of Violence
118 19/09/2011 13:13    Bob Smith   example text    148 118 12/10/2011 10:42    red reder   309 118 19/09/2011 13:13    test!
118 19/09/2011 13:13    Bob Smith   example text    148 118 12/10/2011 10:42    red reder   310 118 19/09/2011 13:14    In Vehicle
118 19/09/2011 13:13    Bob Smith   example text    148 118 12/10/2011 10:42    red reder   311 118 19/09/2011 13:14    act of 
118 19/09/2011 13:13    Bob Smith   example text    148 118 12/10/2011 10:42    red reder   339 118 22/09/2011 13:02    blah blah
118 19/09/2011 13:13    Bob Smith   example text    148 118 12/10/2011 10:42    red reder   483 118 12/10/2011 9:24 
118 19/09/2011 13:13    Bob Smith   example text    148 118 12/10/2011 10:42    red reder   506 118 12/10/2011 10:42    
118 19/09/2011 13:13    Bob Smith   example text    149 118 12/10/2011 10:42    done    none    309 118 19/09/2011 13:13    test!
118 19/09/2011 13:13    Bob Smith   example text    149 118 12/10/2011 10:42    done    none    310 118 19/09/2011 13:14    In Vehicle
118 19/09/2011 13:13    Bob Smith   example text    149 118 12/10/2011 10:42    done    none    311 118 19/09/2011 13:14    act of 
118 19/09/2011 13:13    Bob Smith   example text    149 118 12/10/2011 10:42    done    none    339 118 22/09/2011 13:02    blah blah

Я написал эту функцию для сортировки результатов в массив, функция примера работает только с двумя таблицами, а вторая - с отношением один ко многим. Однако у меня есть более сложная версия, которая работает с более чем двумя таблицами, но проблема заключается в сортировке.

mysqlResult - это ассоциативный массив из вызова mysql_query, parent_key - это имя первичного ключа родительской таблицы, child_key - это имя первичный ключ дочерней таблицы, child_table - это имя дочерней таблицы, child_fields - ассоциативный массив имен всех полей в дочерней таблице

функция cleanJoin ($ mysqlResult, $ parent_key, $ child_key, $ child_table, $ child_fields) { $ last_parent = 0; $ last_child = 0; $ ch_ctr = 0;

for ($i = 0; $i < count($mysqlResult); $i++)
{
    if ($mysqlResult[$i][$child_key] != $last_child)
    {
        echo "new child!";
        $pr_ctr = count($answer[$i]);
        foreach ($child_fields as $field => $type)
        {
           $answer[$pr_ctr][$child_table][$ch_ctr][$field] = $mysqlResult[$i][$field];
           unset($mysqlResult[$field]);
        }
        $ch_ctr++;
    }
    if ($mysqlResult[$i][$parent_key] != $last_parent)
    {
        foreach($mysqlResult[$i] as $field => $value)
        {
            $answer[$i][$field] = $value;
        }
    }
    $last_parent = $mysqlResult[$i][$parent_key];
    $last_child = $mysqlResult[$i][$child_key];
}

return $answer;

}

1 Ответ

0 голосов
/ 21 октября 2011

Я не знаю, правильно ли я понимаю ваш вопрос, но, возможно, вам нужен модификатор WITH ROLLUP для предложения GROUP BY: http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html.

В вашем запросе вы должны изменить

ORDER BY `Master`.Master_ID,`Changes`.Change_ID,`Comments`.Comment_ID

в

GROUP BY `Master`.Master_ID,`Changes`.Change_ID,`Comments`.Comment_ID WITH ROLLUP

Я не уверен, что он будет работать с JOINS, поскольку во всех примерах в документации используется одна таблица, но при проверке нет никакого вреда.

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