Здравствуйте, Подскажите правильная ли логика построения БД такой структуры. CREATE TABLE IF NOT EXISTS `golog` ( `date` TIMESTAMP NULL DEFAULT NULL, `meta_key` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0', `meta_value` varchar(200) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0' ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; INSERT INTO `golog` (`date`, `meta_key`, `meta_value`) VALUES ('2021-11-21 14:56:03', 'all_sum', '125'), ('2021-11-21 14:56:03', 'type', 'C1'), ('2021-11-21 14:56:03', 'max_type_c1', '122'), ('2021-11-21 14:56:03', 'rez_type_h1', '100'); // Если больше 100 квадратик зеленый, меньше 0 красный COMMIT; В верхних и нижних блоках есть иерархия Z.. и О.. всегда в последовательном ранге ближе к центру разделения, а далее в последовательном ранге идут J.. и C.. Блоки строятся так: Код (Text): <style> .bl { width:1.72rem; height:.9rem; border:1px solid #ececec; display: inline-flex; justify-content: center; align-items: center; vertical-align: middle; user-select: none; position: relative; font-size:.7rem; margin:1px; } </style> <div class="block" style="width:30px;display:inline-flex;"> <div class="block" style="width:30px;display: inline-flex;margin:0px;"> <div class="bl" style="font-size:.6rem;background:#fdf8d0;">25.08</div> <div class="bl" style="font-size:.6rem;background:#eaf2f2;">125</div> </div> <div class="block" style="width:30px;display:inline-flex;margin:0px;background:#ff6a6a;"> <div class="bl" style="margin-bottom:0;font-size:.7rem;border-bottom:0;">J5</div> <div class="bl" style="margin-top:0;font-size:.6rem;background:#f7f7e2;border-top:0;">98</div> </div> <div class="block" style="width:30px;display:inline-flex;margin:0px;background:#ff6a6a;"> <div class="bl" style="margin-bottom:0;font-size:.7rem;border-bottom:0;">J1</div> <div class="bl" style="margin-top:0;font-size:.7rem;background:#f7f7e2;border-top:0;">10</div> </div> <div class="block" style="width:30px;display:inline-flex;margin:0px;background:#ff6a6a;"> <div class="bl" style="margin-bottom:0;font-size:.7rem;border-bottom:0;">O5</div> <div class="bl" style="margin-top:0;font-size:.6rem;background:#f7f7e2;border-top:0;">98</div> </div> <div class="block" style="width:30px;display:inline-flex;margin:0px;background:#06b500;"> <div class="bl" style="margin-bottom:0;font-size:.7rem;border-bottom:0;">O4</div> <div class="bl" style="margin-top:0;font-size:.6rem;background:#f7f7e2;border-top:0;">19</div> </div> <div class="block" style="width:30px;display:inline-flex;margin:0px;background:#06b500;"> <div class="bl" style="margin-bottom:0;font-size:.7rem;border-bottom:0;">O2</div> <div class="bl" style="margin-top:0;font-size:.6rem;background:#f7f7e2;border-top:0;">19</div> </div> <div class="bl" style="height:2px;background:#222;"></div> <div class="block" style="width:30px;display: inline-flex;margin:0px;background:#ff6a6a;"> <div class="bl" style="margin-bottom:0;font-size:.7rem;border-bottom:0;">Z5</div> <div class="bl" style="margin-top:0;font-size:.6rem;background:#f7f7e2;border-top:0;">9</div> </div> <div class="block" style="width:30px;display: inline-flex;margin:0px;background:#ff6a6a;"> <div class="bl" style="margin-bottom:0;font-size:.7rem;border-bottom:0;">C1</div> <div class="bl" style="margin-top:0;font-size:.6rem;background:#f7f7e2;border-top:0;">9</div> </div> <div class="block" style="width:30px;display: inline-flex;margin:0px;background:#ff6a6a;"> <div class="bl" style="margin-bottom:0;font-size:.7rem;border-bottom:0;">C2</div> <div class="bl" style="margin-top:0;font-size:.6rem;background:#f7f7e2;border-top:0;">11</div> </div> </div> Подскажите как правильно вывести из БД в PHP такие данные. Таких блоков будет около 4000
я тупой наверное но по картинкам ни структуры БД ни логики не вижу... может по человечески попытаетесь объяснить - что вы хотите хранить в БД, какие данные, как они связаны друг с другом и прочее?
Данные выводятся в такие блоки в зависимости от даты Пример данных из БД за 28,08 INSERT INTO `golog` (`date`, `meta_key`, `meta_value`) VALUES ('2021-11-21 14:56:03', 'all_sum', '125'), /* FOR TOP DATA */ ('2021-11-21 14:56:03', 'type', 'O2'), ('2021-11-21 14:56:03', 'max_type_o2', '19'), ('2021-11-21 14:56:03', 'rez_type_o2', '100'), ('2021-11-21 14:56:03', 'type', 'O4'), ('2021-11-21 14:56:03', 'max_type_o4', '19'), ('2021-11-21 14:56:03', 'rez_type_o4', '100') ('2021-11-21 14:56:03', 'type', 'O5'), ('2021-11-21 14:56:03', 'max_type_o5', '98'), ('2021-11-21 14:56:03', 'rez_type_o5', '-50'), ('2021-11-21 14:56:03', 'type', 'J1'), ('2021-11-21 14:56:03', 'max_type_j1', '10'), ('2021-11-21 14:56:03', 'rez_type_j1', '-12'), ('2021-11-21 14:56:03', 'type', 'J5'), ('2021-11-21 14:56:03', 'max_type_j5', '98'), ('2021-11-21 14:56:03', 'rez_type_j5', '-33'), /* FOR BOTTOM DATA */ ('2021-11-21 14:56:03', 'type', 'Z5'), ('2021-11-21 14:56:03', 'max_type_z5', '19'), ('2021-11-21 14:56:03', 'rez_type_z5', '100'), ('2021-11-21 14:56:03', 'type', 'C1'), ('2021-11-21 14:56:03', 'max_type_c1', '9'), ('2021-11-21 14:56:03', 'rez_type_c1', '-11') ('2021-11-21 14:56:03', 'type', 'c2'), ('2021-11-21 14:56:03', 'max_type_c2', '11'), ('2021-11-21 14:56:03', 'rez_type_c2', '-50'); COMMIT;
Если вы, по каким-то причинам не можете изменить структуру этой таблицы, то для требуемой вам выборки придется пользоваться самообъединением таблицы. Если же структура не принципиальна, то вместо одной таблицы сделайте три. С общей колонкой, и объединяйте по ней. Потому, что самообъединение понадобится довольно хитрое - с извлечением подстрок.
Хочу выводить информацию из БД. Идет набор последовательных дней, в каждом из дней есть маркеры которые появляются. Есть два главных параметра: 1. Дата (день) 2. Вся сума дня В дне присутствуют маркеры и их значение (В верхних и нижних блоках есть иерархия Z.. и О.. всегда в последовательном ранге ближе к центру разделения, а далее в последовательном ранге идут J.. и C..) ('2021-11-21', 'type', 'J5'), ('2021-11-21', 'max_type_j5', '98'), А так ?)
Код (Text): Таблица 2 Markers: ----------------- Date |Type |MAX_Type | REZ_type ----------------- 2021-11-10 | C1 | 88 | -22 2021-11-10 | C2 | 22 | 44 2021-11-11 | J1 | 19 | -9 Таблица 1 Period: ----------------- Date | all_sum ---------------- 2021-11-10 | 200 2021-11-11 | 100 2021-11-12 | 300 Ожидаемый результат: ------------------------- 2021-11-10 |200| C1 88 -22, C2 22 44, .... , .... 2021-11-11 |100| J1 19 -9, .... , ....
очень неадекватная структура БД но если так хотите, то как-то так Код (Text): SELECT p.all_sum, GROUP_CONCAT(p.type) AS v1, GROUP_CONCAT(MAX_type) AS v2, GROUP_CONCAT(REZ_type) AS v3 FROM Period AS p LEFT JOIN Markers As m IN m.date = p.date GROUP BY p.date так же крайне неадекватно, + ограничение на длину результата GROUP_CONCAT в 1024 символа по хорошему - попытаться объяснить что эти поля значат зачем, каков реальный смысл данных, вам подскажут нормальную структуру БД для их хранения, и все запросы станут легче
Каждый будний (за исключением выходных) проводится анализ состояния сельхозземли. На основе полученных данных нужно построить диаграмму. Входящие данные за день: 1. Дата 2. Показатель влажности земли 3. Маркеры для анализа состояния земли * Название маркера: Нижние блоки (Z2,Z3,Z4,Z5) (C1,C2,C3,C4,C5) и Верхние блоки (O2,O3,O4,O5) (J1,J2,J3,J4,J5) * Значение маркера * Критическое значение маркера // Если значение больше 100 квадратик зеленый, меньше 0 красный Для удобного отображения данных для человеческого глаза при выводе строятся по следующему типу. 28.05 - ДАТА анализа 28 мая 155 - Показатель влажности земли J5 J4 J3 J2 J1 O5 O4 O3 O2 О&& - более важный поэтому они всегда идут ближе к разделителю, J&& - идут после ---- РАЗДЕЛИТЕЛЬ, между верхним и нижним блоком маркеров Z&& - более важный поэтому они всегда идут ближе к разделителю, С&& - идут после Z2 Z3 Z4 Z5 C1 C2 C3 C4 C5
Ну я бы сделал че-нить типа такого Код (Text): markers ----------------- period_id |Type |MAX_Type | REZ_type | sort ----------------- 1 | C1 | 88 | -22 | 1 1 | C2 | 22 | 44 | 2 2 | J1 | 19 | -9 | 3 period PHP: id | Date | all_sum ---------------- 1 | 2021-11-10 | 200 2 | 2021-11-11 | 100 3 | 2021-11-12 | 300 --- Добавлено --- за большой период чтоб строить данные- можно выбрать за определенный промежуток все данные в массив, а уже на стороне php группировать массивы по периодам - и строить отображение периодов sort ввел, чтоб сортировку проще ыло нативную делать, чем голову ломать какой тип выше ниже
Здесь, на мой взгляд, достаточно, просто объединить таблицы по дате, и отсортировать по двум колонкам - Date и Type
Я так и сделал... Код (Text): $sql = "SELECT M.rank, M.date, M.type_marker FROM markers M INNER JOIN period P ON M.date = P.date WHERE M.rank LIKE 'T%' ORDER BY M.date DESC, M.rank DESC"; $result = $conn->query($sql); if ($result->num_rows > 0) { while($top = $result->fetch_assoc()) { echo "rank: " . $top["rank"]. " date: " . $top["date"]. " type: " . $top["type_marker"]. "<br>"; } } else { echo "0"; } вот что у меня получилось http://desaps.000webhostapp.com/z.php А как вывести эти данный поблочно по дате. Сейчас все идет одной строкой
Подскажите пожалуйста, а так правильно делать Код (Text): $sqlPeriod = "SELECT * FROM `period` ORDER BY `period`.`date` DESC"; $result = $conn->query($sqlPeriod); if ($result->num_rows > 0) { while($period = $result->fetch_assoc()) { echo "id: " . $period["id"]. " date: " . $period["date"]. " type: " . $period["vol"]."<br>"; $sqlT = "SELECT M.rank, M.date, M.type_marker FROM markers M WHERE M.date='".$period["date"]."' AND M.rank LIKE 'T%' ORDER BY M.date DESC, M.rank DESC"; $resultT = $conn->query($sqlT); if ($resultT->num_rows > 0) { while($top = $resultT->fetch_assoc()) { echo "rank: " . $top["rank"]. " date: " . $top["date"]. " type: " . $top["type_marker"]."<br>"; } } else { echo "0"; } echo "---------------------------------------<br>"; $sqlB = "SELECT M.rank, M.date, M.type_marker FROM markers M WHERE M.date='".$period["date"]."' AND M.rank LIKE 'B%' ORDER BY M.date DESC, M.rank ASC"; $resultB = $conn->query($sqlB); if ($resultB->num_rows > 0) { while($bottom = $resultB->fetch_assoc()) { echo "rank: " . $bottom["rank"]. " date: " . $bottom["date"]. " type: " . $bottom["type_marker"]. "<br>"; } } else { echo "0"; } echo "<br><br>"; } } else { echo "NO DATA"; }