Показать значения из других таблиц в цикле
В моей базе данных у меня есть 3 таблицы:
train_information:
+----------+-----------------+------------------+
| train_id | number_of_axles | number_of_bogies |
+----------+-----------------+------------------+
| 1 | 4 | 2 |
+----------+-----------------+------------------+
ось:
+---------+----------+------+----------+
| axle_id | train_id | axle | distance |
+---------+----------+------+----------+
| 1 | 1 | 1 | 2500 |
| 2 | 1 | 2 | 5000 |
| 3 | 1 | 3 | 2500 |
+---------+----------+------+----------+
тележка:
+----------+----------+---------+----------+
| bogie_id | train_id | axle_nr | bogie_nr |
+----------+----------+---------+----------+
| 1 | 1 | 1 | 1 |
| 2 | 1 | 2 | 1 |
| 3 | 1 | 3 | 2 |
| 4 | 1 | 4 | 2 |
+----------+----------+---------+----------+
Когда что-то вставлено в таблицу train_information
, триггер также вставляет в другие 2 таблицы (Distance и bogie_nr обновляются позже, но в этом примере все уже заполнено).
Теперь я создаю модель поезда на основе значений distance & axle
.
Сейчас это выглядит так:
<div id="axles">
<!--This is the last (useless) axle, wich always is 0-->
<div id="useless_circle"></div>
<!--Here we create the axles and style them with the distances-->
<?php
$show_axle = $database->axles($_GET['train_id']);
$total_distance = 0;
foreach($show_axle as $number_ofaxles){
$total_distance += $number_ofaxles['distance']; ?>
<div id="axle" name="test" style="margin-left:<?= $total_distance/25000*100;?>%">
<?= "<div id='circle'>" . $number_ofaxles['axle'] . "</div>";?>
</div>
<?php } ?>
</div>
и
function axles($id){
$sql = "SELECT * FROM axle WHERE train_id = :id2";
$sth = $this->pdo->prepare($sql);
$sth->bindParam(":id2", $id, PDO::PARAM_STR);
$sth->execute();
return $sth->fetchAll();
}
Теперь страница выглядит следующим образом (со значениями БД):
![How the page looks.]()
Код, который я предоставил, предназначен только для осей! (4 круга под поездом)!
Теперь, что я хочу:
Прямо сейчас, я просто прошу значение таблицы осей. но он содержит только 3 оси вместо 4. Это потому, что я хочу знать расстояние МЕЖДУ каждой осью. поэтому мне всегда нужно 1 меньше.
Я решил это, сделав 1 дополнительный div, который создает круг (ось), а места - влево.
То, что я хотел бы иметь, это что-то вроде:
показать axle_nr
из таблицы bogie
(так что это показывает 4).
Получите distance
, где axle
= axle_nr
.
Тогда вы всегда держите 1 пустым. потому что ось 4. не существует в таблице axle
.
Поэтому я хочу сделать чек: если ось не существует, то расстояние = 0. Я не хочу вставлять это в базу данных, но просто так мне больше не нужна бесполезная ось. И ось остается слева.
Почему я хочу этого?
Таким образом, я могу проверить, что номера тележек одинаковы, поэтому я могу дать им каждый другой цвет и т.д. Также мне не понадобится бесполезный div!
EDIT:
Простое объяснение:
Я хочу показать axle_nr
из таблицы bogie
. (Таким образом, он отображает 4 круга)
Однако! Мне понадобится distance
из таблицы axle
, чтобы сделать цифру поезда.
как вы можете видеть, таблица axle
имеет 1 меньшую ось, чем таблица bogie
.
Поэтому я хочу, чтобы "Не существующая" ось имела значение 0. Я хочу это 0, потому что тогда он появится в начале поезда. (Как и бесполезная ось прямо сейчас)
ИЗМЕНЕНИЕ КОДА:
Сейчас у меня есть это:
<div id="axles">
<?php
$testingggg = $database->axleees();
foreach ($testingggg as $lol){ ?>
<div id="axle">
<div id="circle" name="<?= $lol['axle'] ?>"><?= $lol['axle'] ?></div>
</div>
<?php } ?>
</div>
И:
function axleees() {
$sql = "SELECT ti.axle_nr, ti.train_id, ti.bogie_nr, uti.axle_id, uti.train_id, uti.axle, uti.distance
FROM bogie as ti
JOIN axle as uti
ON ti.train_id = uti.train_id
WHERE ti.train_id = :train_id";
$sth = $this->pdo->prepare($sql);
$sth->bindParam(":train_id", $_GET["train_id"], PDO::PARAM_INT);
$sth->execute();
return $sth->fetchAll();
}
И это показывает мне 12 осей вместо 4!
EDIT:
он показывает мне 4 оси, которые теперь правильны.
Однако мне также нужны правильные расстояния. Код у меня:
<div id="axles">
<?php
$total_distance = 0;
foreach ($testingggg as $lol){
$total_distance += $lol['distance'];
?>
<div id="axle" style="margin-left:<?= $total_distance/25000*100;?>%">
<div id="circle" name="<?= $lol['axle'] ?>"><?= $lol['axle_nr'] ?></div>
</div>
<?php } ?>
</div>
Прямо сейчас, это показывает мне, что каждая ось имеет запас 10%. это правильно (если у вас только первая ось). он должен быть чем-то вроде 10-15-10-15 или около того. Как это сделать?
EDIT:
Сейчас у меня есть следующий запрос:
function axleees() {
$sql = "SELECT ti.axle_nr, ti.train_id, ti.bogie_nr, uti.axle_id, uti.train_id, uti.axle, uti.distance
FROM bogie as ti
JOIN axle as uti
ON ti.train_id = uti.train_id
WHERE ti.train_id = :train_id
GROUP BY uti.axle_id";
$sth = $this->pdo->prepare($sql);
$sth->bindParam(":train_id", $_GET["train_id"], PDO::PARAM_INT);
$sth->execute();
return $sth->fetchAll();
}
En я называю это здесь:
<div id="axles">
<?php
$total_distance = 0;
foreach ($testingggg as $lol){
$total_distance += $lol['distance'];
$margin = $total_distance/25000*100;
?>
<div id="axle" style="margin-left:<?= $margin; ?>%">
<div id="circle" name="<?= $lol['axle'] ?>"><?= $lol['axle_nr'] ?></div>
</div>
<?php } ?>
</div>
Изображение EDIT:
![train example]()
Ответы
Ответ 1
Мне кажется, что это довольно запутанный способ обойти оригинальную проблему. Вы застенчивы одна ось, и вам нужна эта ось в вашей базе данных. Вы сказали, что все значения добавляются через триггер в базе данных. Если это так, почему бы не добавить значение, имеющее расстояние "0" с идентификатором поезда. Это даст вам не только ось, но и обработанный div.
Если бы ваша таблица выглядела так, как это было после поколения (пожалуйста, простите меня, если индекс выключен в неправильном направлении. Я пытаюсь просто понять ваш макет базы данных):
+---------+----------+------+----------+
| axle_id | train_id | axle | distance |
+---------+----------+------+----------+
| 0 | 1 | 0 | 0 |
| 1 | 1 | 1 | 2500 |
| 2 | 1 | 2 | 5000 |
| 3 | 1 | 3 | 2500 |
+---------+----------+------+----------+
Затем следующие типы генерируют все круги, в том числе те, у которых есть маржа (или расстояние, указанное выше) от '0'. С технической точки зрения у вас есть ось с расстоянием "0" от передней части поезда, поэтому почему бы не отслеживать ее в вашей базе данных.
<div id="axles">
<!--Here we create the axles and style them with the distances-->
<?php
$show_axle = $database->axles($_GET['train_id']);
$total_distance = 0;
foreach($show_axle as $number_ofaxles){
// Because the first value is 0, the first run will be against the left edge.
$total_distance += $number_ofaxles['distance']; ?>
<div id="axle" name="test" style="margin-left:<?=$total_distance/25000*100;?>%">
<?= "<div id='circle'>" . $number_ofaxles['axle'] . "</div>";?>
</div>
<?php } ?>
</div>
Использование этого подхода упрощает и решает вашу проблему.
Ответ 2
Измените
$sql = "SELECT ti.axle_nr, ti.train_id, ti.bogie_nr, uti.axle_id, uti.train_id, uti.axle, uti.distance
FROM bogie as ti
JOIN axle as uti
ON ti.train_id = uti.train_id
WHERE ti.train_id = :train_id";
к
$sql = "SELECT ti.axle_nr, ti.train_id, ti.bogie_nr, uti.axle_id, uti.train_id, uti.axle, uti.distance
FROM bogie as ti
LEFT JOIN axle as uti
ON ti.train_id = uti.train_id AND uti.axle_id = ti.axle_nr
WHERE ti.train_id = :train_id";
Или запустите для тестирования следующего sql:
SELECT
b.*,
a.*
FROM bogie AS b
LEFT JOIN axle AS a ON a.train_id = b.train_id AND a.axle_id = b.axle_nr
WHERE b.train_id = 1
возвращает 4 строки вместо 12.