Группировка записей базы данных в динамические таблицы HTML - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть база данных, где команды будут иметь несколько записей, каждая из которых находится в разных местах.Каждая запись будет иметь название команды.Так, например, team1 может появляться несколько раз, но каждый раз местоположение будет отличаться.

Структура БД (каждая из них представляет заголовок столбца):

team_name, first_name, last_name, location, arrival_time

MyТекущий рабочий код создает таблицы 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 голосов
/ 14 февраля 2019

Ваша проблема связана с 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

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