我有三张桌子
id1 title1 id2 title2 id3 title3
1 .... 1 .... 1 .....
2 ..... 2 ..... 2 ....
3 ... 3 ..... 3 ....
4 ..... 4 ....
5 .....
假设每个 title1 都有一些 title2 ,而每个 title2 都有一些 title3 。我想要一个输出
title1
title2
title3
title3
title2
title3
title2
title3
title3
title3
------------
title1
title2
title3
title2
title3
title3
.
.
.
.
虽然我能够创建(我使用 JOINs) 。我使用了三个$command = mysqli..
和3个while loops
。就像
$command = mysqli...
while($row = mysqli_fetch_array($command)){
echo ..
$command2 = mysqli...
while($row2 = mysqli_fetch_array($command2)){
echo ..
$command3 = mysqli...
while($row3 = mysqli_fetch_array($command3)){
echo ..
}
}
}
其他人对我的代码发表了评论,并表示"有没有办法不使用三个while循环"或者"为什么要三次调用数据库?"
你能做到吗? 有没有办法只用一个mysqli_query()
获得意图输出?
答案 0 :(得分:0)
让我们一起加入表:
SELECT t1.id id1, t1.title tit1, t2.id id2, t2.title tit2, t3.id id3, t3.title tit3 FROM table1 t1 JOIN table2 t2 ON t1.id =t2.pid JOIN table3 t3 ON t2.id =t3.pid ORDER BY id1, id2, id3;
在PHP中:
$tt1 = -1;
$tt2 = -1;
$tt3 = -1;
while($row = mysqli_fetch_array($command)){
if($row['id1'] != $tt1){
$tt1 = $row['id1'];
echo ( $row['tit1'];
}
if($row['id2'] != $tt2){
$tt2 = $row['id2'];
echo ( $row['tit2'];
}
if($row['id3'] != $tt3){
$tt3 = $row['id3'];
echo ( $row['tit3'];
}
}
我不测试它,因为我从手机发布。我认为它应该有用。
答案 1 :(得分:0)
假设您的每个表都有一个将其链接到其父表的键列,您应该可以在一个查询中将它们全部连接在一起。
$sql = "SELECT id1, title1, id2, title2, id3, title3
FROM table1
LEFT JOIN table2 ON table1.id1 = table2.id1
LEFT JOIN table3 ON table2.id2 = table3.id2
ORDER BY id1, id2, id3";
$command = mysqli_query($sql);
我不确定外键列的名称,但这应该足以让你知道我的意思。
然后,您可以在获取查询结果时构建多维数组。
$tree = array();
while ($row = mysli_fetch_object($command)) {
$tree[$row->id1]['title'] = $row->title1;
$tree[$row->id1]['subtitles'][$row->id2]['title'] = $row->title2;
$tree[$row->id1]['subtitles'][$row->id2]['subtitles'][] = $row->title3;
}
拥有该阵列后,您可以通过多种方式选择格式化阵列。例如,这是一个嵌套列表。
echo '<ul>';
foreach($tree as $title1) {
echo '<li>' . $title1['title'] . '<ul>';
foreach ($title1['subtitles'] as $title2) {
echo '<li>' . $title2['title'] . '<ul><li>';
echo implode('</li><li>', $title2['subtitles']);
echo '</li></ul></li>';
}
echo '</ul></li>';
}
echo '</ul>';
从这些结构中的重复可以看出,如果添加更多级别,使用递归函数生成输出会更有意义。