Показывать значения из других таблиц в цикле


В моей базе данных у меня есть 3 таблицы:

Информация о поезде:

+----------+-----------------+------------------+
| 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 таблицы (расстояние и 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 оси, И ось остается слева.

Почему я этого хочу?
Таким образом, я могу проверить, какие номера тележек совпадают, чтобы я мог придать им другой цвет и т. Д. Также мне не понадобится бесполезный div_axle!

РЕДАКТИРОВАТЬ:

Простое объяснение:

Я хочу показать 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!

РЕДАКТИРОВАТЬ:

Теперь он показывает мне 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 или около того. Как мне это сделать?

РЕДАКТИРОВАТЬ:

Прямо сейчас у меня есть следующий запрос:

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();
    }

Ru Я называю это здесь:

<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>

Редактирование изображения:

train example

Author: Mitch, 2015-05-28

2 answers

Мне кажется, что это довольно запутанный способ обойти исходную проблему. Вы стесняетесь одной оси, и вам нужно, чтобы эта ось была в вашей базе данных. Вы сказали, что все значения добавляются с помощью триггера в базе данных. Если это так, почему бы не добавить значение, имеющее расстояние "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>

Такой подход одновременно упрощает и решает вашу проблему.

 4
Author: GKnight, 2015-06-05 08:20:10

Изменение

   $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.

 3
Author: Danila Ganchar, 2015-06-03 08:34:06