将数据库条目分组为动态HTML表

时间:2019-02-13 11:48:38

标签: php html sql mysqli

我有一个数据库,团队在其中有多个条目,每个条目都在不同的位置。每个条目都有一个团队名称。因此,例如,team1可能会出现几次,但是每次位置都会不同。

数据库的结构是(每个代表列标题):

team_name, first_name, last_name, location, arrival_time

我当前的工作代码创建按团队名称分组的HTML表,但当前仅创建一行以显示第一个位置和第一个位置的到达时间。我需要它来动态创建更多行,以显示每个团队的所有位置和到达时间。

所需的结果如下所示- https://codepen.io/TheBigFolorn/pen/LqJeXr

但是当前结果看起来像这样- https://codepen.io/TheBigFolorn/pen/qgMppx

这是一个有关数据库表外观的示例- https://codepen.io/TheBigFolorn/pen/daqJze

我尝试分解回波并在要应用上述逻辑的行之前添加第二个while循环,但似乎破坏了所有操作。非常感谢您提供有关如何使它工作而不需要为每个团队使用单独查询的任何意见。我是php的新手,所以请放轻松:)

<?php

$leaders = "SELECT *, COUNT(location) FROM my_example_table  GROUP BY team_name";
$result = mysqli_query($connect, $leaders) or die ("<br>** Error in database table <b>".mysqli_error($connect)."</b> **<br>$sql");


if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
     echo "
        <div class='red-border'>
            <h2>". $row["team_name"]. "<br><small>Total locations visited: ". $row["COUNT(location)"]. "</small></h2>
        </div>
        <div class='data-holder'>
            <table>
                <tr>
                    <th>Location</th>
                    <th>Time of arrival</th>
                </tr>

                <tr><td>". $row["location"]. "</td> <td>". $row["arrival_time"]. "</td></tr>

            </table>
        </div>
        ";
    }
} else {
echo "0 results";
}

?>

1 个答案:

答案 0 :(得分:2)

您的问题是由于您可能已经意识到的GROUP BY而引起的。为了获得每个团队的人数,这是必需的,但是每个团队的输出行数仅为1-这就是分组的作用。从根本上说,运行诸如COUNT或SUM之类的聚合查询与同时输出所有行数据是不兼容的。您可以做一个或另一个。

现在,您可以运行两个查询-一个用于获取计数,一个用于获取所有行。但是实际上您并不需要。如果仅选择所有行,则每团队计数将隐含在数据中。由于您仍然需要遍历它们以将它们输出到HTML中,因此您最好使用该过程来跟踪每个团队在前进过程中获得了多少行,并创建“总计相应的HTML中的位置数”标题。

这有两点很重要:

1)使查询以有用的顺序输出数据:

SELECT * FROM my_example_table  Order By team_name, arrival_time;

2)到达表格行后,不会立即将HTML回显到页面。相反,将HTML代码段放入变量中,您可以在过程中的不同时间填充变量(因为在循环了该团队的所有行之前,您将不知道每个团队的总位置),然后将它们全部串在一起稍后获得最终输出:

$leaders = "SELECT * FROM my_example_table  Order By team_name, arrival_time;";
$result = mysqli_query($connect, $leaders) or die ("<br>** Error in database table <b>".mysqli_error($connect)."</b> **<br>$sql");

$currentTeam = "";
$locationCount = 0;
$html = "";
$teamHtmlStart = "";
$teamHtmlEnd = "";

if ($result->num_rows > 0)
{

while($row = $result->fetch_assoc()) 
{
  //run this bit if we've detected a new team
  if ($currentTeam != $row["team_name"]) { 
      //finalise the previous team's html and append it to the main output
      if ($currentTeam != "") $html .= $teamHtmlStart.$locationCount.$teamHtmlEnd."</table></div>";

      //reset all the team-specific variables
      $currentTeam = $row["team_name"];
      $teamHtmlStart = "<div class='red-border'><h2>".$currentTeam."<br><small>Total locations visited: ";
      $locationCount = 0;
      $teamHtmlEnd = "</small></h2>
        </div>
        <div class='data-holder'>
            <table>
                <tr>
                    <th>Location</th>
                    <th>Time of arrival</th>
                </tr>";
  }

  $teamHtmlEnd .= "<tr><td>". $row["location"]. "</td> <td>". $row["arrival_time"]. "</td></tr>";
  $locationCount++;
}

//for the final team (since the loop won't go back to the start):
$html .= $teamHtmlStart.$locationCount.$teamHtmlEnd."</table></div>";
echo $html;
}
else {
echo "0 results";
}

这是一个可运行的演示(使用一些静态数据代替SQL查询):http://sandbox.onlinephpfunctions.com/code/2f52c1d7ec242f674eaca5619cc7b9325295c0d4