PHP - пропустить отображение дубликатов полей (не записей) в запросе MySQL

0

Мой код просто запрашивает базу данных и выводит на таблицу HTML:

<?php

  include("incl\dbcon.php");

  $sql = "SELECT * FROM attendanceRecord";

  $result = $db_con->query($sql);

  echo "<table>
  <tr>
  <th>Date</th>
  <th>Building Name</th>
  <th>Room Name</th>
  <th>Student</th>
  <th>Time</th>
  </tr>";

  while($row_result = $result->fetch_assoc()){
    echo "<tr>";
    echo "<td>" . $row_result['rDate'] . "</td>";
    echo "<td>" . $row_result['rBuildingName'] . "</td>";
    echo "<td>" . $row_result['rRoomName'] . "</td>";
    echo "<td>" . $row_result['rStudent'] . "</td>";
    echo "<td>" . $row_result['rTime'] . "</td>";
    echo "</tr>";
  }

  $db_con->close();

  echo "</table>";

?>

результат выглядит так:

Date         Building Name    Room Name  Student    Time
2018-07-12   Building A       1A         Sam        08:32:33
2018-07-12   Building A       1A         David      08:54:21
2018-07-12   Building A       1A         Dragon     08:50:10
2018-07-12   Building A       1B         John       08:43:11
2018-07-12   Building A       1B         Coco       08:51:39
2018-07-12   Building B       3A         Mary       08:21:23
2018-07-12   Building B       3A         Martin     08:46:57
2018-07-12   Building B       4B         Ray        08:26:47

Как я могу не показывать или пустить повторяющиеся поля в строке и сделать таблицу ниже?

Date         Building Name    Room Name  Student    Time
2018-07-12   Building A       1A         Sam        08:32:33
                                         David      08:54:21
                                         Dragon     08:50:10
                              1B         John       08:43:11
                                         Coco       08:51:39
             Building B       3A         Mary       08:21:23
                                         Martin     08:46:57
                              4B         Ray        08:26:47

Где я должен подойти? из sql-запроса (не знаю, есть ли функция для пустых или NULL дубликатов полей во время запроса) или php-массив (напечатайте NULL, если дубликат затем переместите указатель?), пожалуйста, помогите, спасибо заранее!

  • 3
    Почему вы пытаетесь сделать это на стороне MySQL? Это вопрос представления данных и должен быть сделан с учетом логики приложения.
  • 0
    Спасибо за ваш комментарий, я не настаиваю на том, чтобы делать это на стороне MySQL, просто пытаюсь найти решение соответствующим образом.
Теги:

2 ответа

1
Лучший ответ

Предполагая, что строки всегда выходят в правильном порядке (вы можете использовать ORDER BY, чтобы убедиться в этом!), То в PHP сохраните переменную, которая содержит значение даты из предыдущей строки. Если он соответствует дате в текущей строке, не печатайте это значение в td. Если это не так, напечатайте его, так как он должен быть новым. Тот же подход для имени здания и названия комнаты, но в контексте текущей даты (и построения):

$date = "";
$buildingName = ""; //declare these outside the loop so they persist between loops
$roomName = "";

while($row_result = $result->fetch_assoc()){
    echo "<tr>";
    echo "<td>" . ($row_result['rDate'] == $date ? "" : $row_result['rDate']) . "</td>";
    echo "<td>" .($row_result['rBuildingName'] == $buildingName $row_result['rDate'] == $date ? "" : $row_result['rBuildingName']) . "</td>";
    echo "<td>" . ($row_result['rRoomName'] == $roomName && $row_result['rBuildingName'] == $buildingName && $row_result['rDate'] == $date ? "" : $row_result['rRoomName']) . "</td>";
    echo "<td>" . $row_result['rStudent'] . "</td>";
    echo "<td>" . $row_result['rTime'] . "</td>";
    echo "</tr>";
    //update the references to the specific fields
    $date = $row_result['rDate'];
    $buildingName = $row_result['rRoomName'];
    $roomName = $row_result['rRoomName'];
}

PS Я бы никогда не попытался сделать это в SQL, поскольку он действительно специфичен для представления данных в этом конкретном контексте, а не для самих данных. Это также намного проще в PHP.

  • 0
    Спасибо за ответ! попробую сегодня вечером и вернусь к вам!
  • 0
    Чувак, твой ответ именно то, что я хочу, спасибо за обучение!
0

В PHP вы можете сделать что-то вроде этого

  include("incl\dbcon.php");

  $sql = "SELECT * FROM attendanceRecord";

  $result = $db_con->query($sql);

  echo "<table>
  <tr>
  <th>Date</th>
  <th>Building Name</th>
  <th>Room Name</th>
  <th>Student</th>
  <th>Time</th>
  </tr>";

  $rDate = $rBuildingName = $rRoomName = $rStudent = $rTime = [];

  while($row_result = $result->fetch_assoc()){

    echo "<tr>";
    echo "<td>" . (!in_array(  $row_result['rDate'] , $rDate) ? $row_result['rDate'] : ''). "</td>";
    echo "<td>" . (!in_array(  $row_result['rBuildingName'] , $rBuildingName) ? $row_result['rBuildingName'] : '') . "</td>";
    echo "<td>" . (!in_array(  $row_result['rRoomName'] , $rRoomName) ? $row_result['rRoomName'] : '') . "</td>";
    echo "<td>" . (!in_array(  $row_result['rStudent'] , $rStudent) ? $row_result['rStudent'] : '') . "</td>";
    echo "<td>" . (!in_array(  $row_result['rTime'] , $rTime) ? $row_result['rTime'] : '') . "</td>";
    echo "</tr>";

    $rDate[] = $row_result['rDate'];
    $rBuildingName[] = $row_result['rBuildingName'];
    $rRoomName[] = $row_result['rRoomName'];
    $rStudent[] = $row_result['rStudent'];
    $rTime[] = $row_result['rTime'];


  }

  $db_con->close();

  echo "</table>";
  • 1
    Почему OP должен делать что-то подобное ? Хороший ответ всегда будет содержать объяснение того, что было сделано и почему это было сделано таким образом, не только для ФП, но и для будущих посетителей SO.
  • 0
    @ B001 ᛦ я думаю, что это само за себя, должен ли он объяснить троичный оператор здесь?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню