我有一个包含多个支持表的主表,这些支持表具有一对多的关系
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
当我这样做时,它按主ID,然后是更改ID,然后是注释ID进行排序。但问题是,我希望它根据主ID进行排序,而注释ID则根据变更ID进行排序。我已经尝试了几种不同的排序方式,但我不能让它做我想做的事,任何帮助都会受到赞赏。
更新 我已经添加了示例输出,如果您注意到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 是子表中所有字段的名称的关联数组< / p>
function 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;
}
答案 0 :(得分:0)
我不知道我是否正确理解了您的问题,但是GROUP BY子句的WITH ROLLUP修饰符可能是您正在寻找的答案: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,因为文档中的示例都使用单个表,但签出时没有任何害处。