如何缩短这个PHP代码?

时间:2015-07-15 20:49:05

标签: php while-loop inner-join

我有三张桌子

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()获得意图输出?

2 个答案:

答案 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>';

从这些结构中的重复可以看出,如果添加更多级别,使用递归函数生成输出会更有意义。