Генерация Web таблицы со значениями из БД с сортировкой

Абажур

Был опыт работы только со статическим html или использованием готовых движков, типа Joomla. Требуется сделать динамическую страницу с переменными данными из мини БД с перечнем пользователей и историей по нескольким численными показателям.

Таблица “history”
— Id: INT (PK);
— user: varchar (40) (FK);
— history_date: date;
— pokazatelj1: INT;
— pokazatelj2: INT;
— pokazatelj3: INT.

Вопросы:
1. Каким образом лучше генерировать текущие максимальные значения показателей в таблице на сайте на текущую дату (history_date), чтобы пользователь сайта мог самостоятельно осуществлять сортировку выводимых записей по одному из трех показателей (pokazateljN БД) нажатием по заголовку поля таблицы.
2. При росте числа записей в таблице истории (кол-ве пользователей), будет ли генерация web-страницы (таблицы), во-первых, загружать БД запросами, и во-вторых, как следствие – увеличивать скорость формирования страницы? Есть ли смысл создавать какие-то промежуточные таблицы в БД для хранения готовых уже отсортированных значений конкретных показателей на определенный момент времени (history_date)?

 

Drunkenmunky

С помощью параметра ORDER BY в SQL-запросе

Если в нужных колонках правильно установлены индексы, то нет.

 

Абажур

Спасибо. Я думаю, для тех кто работает с PHP, моя задача относятся к самым простым, тривиальным операциям. Но все же можете порекомендовать те функции, ключевые темы, слова… PHP, с которым мне нужно ознакомиться для выполнения следующих операций:
— реализация активных ссылок названий полей таблицы с целью сортировки выводимых записей таблицы;
— процесс выборки данных из БД и генерация непосредственно html-кода таблицы страницы.

 

Drunkenmunky

Ну, для понимания принципа достаточно посмотреть как это работает в phpMyAdmin

Вот например:
https://www.php.net/manual/ru/mysqli.quickstart.statements.php
Не лишней будет https://www.php.net/manual/ru/function.printf.php

 

Абажур

miketomlin

Как вариант: https://gency.ru/comment/84
Для выборки по конкретным датам можно использовать второй компонент пути, например /sort-by-pokazatelj1/2021-03-30

Объем страницы не должен неограниченно расти. Если есть риск этого, нужно применить пагинацию. Типичный вариант пагинации описан там же в статье. Есть и более эффективные варианты, например по той же дате.

Как я понял, user – внешний ключ (почему varchar?), значит должна быть еще как мин. таблица пользователей.

 

Абажур

Да, есть таблица пользователей. Постарался упростить свой вопрос на форуме для участников.
User — Int unsigned — внешний ключ на таблицу с подробной информацией о пользователе (ФИО, группа,…)
Спасибо за помощь. Буду вникать.

 

miketomlin

ОК. Если будет нужен упомянутый фронт: https://gency.ru/comment/127

Логика составления комбинированного запроса (без пагинации) в нем будет примерно такая:

PHP:
  1. $query = «SELECT * FROM `{$table(‘history’)}` LEFT JOIN `{$table(‘user’)}` USING(`user`)»;
  2.  
  3. if (strlen($p1))
  4. {
  5.     if (preg_match(‘#^\d{4}-\d{2}-\d{2}$#’, $p1))
  6.     {
  7.         $query .= » WHERE `history_date`=’$p1‘»;
  8.     }
  9.     else
  10.     {
  11.         error(404);
  12.         return;
  13.     }
  14. }
  15.  
  16. $query .= » ORDER BY {$page[‘sort’]}«;

Это если нет отдельной таблицы дат. Часто бывает так, что заранее составляется расписание (определяются даты).

 

Абажур

Хорошо. Спасибо. То что делаю — хобби для детей по мере появления свободного времени. Будут вопросы — обращусь.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *