2015-05-28 12 views
19

W mojej bazy danych mam 3 tabele:Pokaż wartości z innych tabel w pętli

train_information:

+----------+-----------------+------------------+ 
| train_id | number_of_axles | number_of_bogies | 
+----------+-----------------+------------------+ 
|  1 |    4 |    2 | 
+----------+-----------------+------------------+ 

osi:

+---------+----------+------+----------+ 
| axle_id | train_id | axle | distance | 
+---------+----------+------+----------+ 
|  1 |  1 | 1 |  2500 | 
|  2 |  1 | 2 |  5000 | 
|  3 |  1 | 3 |  2500 | 
+---------+----------+------+----------+ 

wózek:

+----------+----------+---------+----------+ 
| bogie_id | train_id | axle_nr | bogie_nr | 
+----------+----------+---------+----------+ 
|  1 |  1 |  1 |  1 | 
|  2 |  1 |  2 |  1 | 
|  3 |  1 |  3 |  2 | 
|  4 |  1 |  4 |  2 | 
+----------+----------+---------+----------+ 

Kiedy coś zostaje włożona w tabeli train_information, spust wstawia również w innych 2 tabel (Odległość & bogie_nr aktualizowane później, ale w tym przypadku wszystko jest już wypełniony).

Teraz wykonuję model pociągu na podstawie wartości distance & axle. Teraz wygląda to tak:

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

oraz:

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

Teraz strona wygląda następująco (z wartościami dB):

How the page looks.

Podany kod jest tylko dla osi! (4 koła pod pociągiem)!

Teraz, co chcę:

Teraz, po prostu poprosić o wartości tabeli osi. ale zawiera tylko 3 osie zamiast 4. To dlatego, że chcę znać odległość MIĘDZY każdą osią. więc zawsze potrzebuję 1 mniej.
Rozwiązałem to, tworząc 1 dodatkowy element div, który tworzy okrąg (oś), a miejsca znajdują się po lewej stronie.

Co chciałbym mieć, to coś w stylu: pokaż axle_nr ze stołu bogie (więc pokazuje 4). Uzyskaj distance gdzie axle = axle_nr.
Wtedy zawsze przechowuj 1 puste. ponieważ oś 4. nie istnieje w tabeli axle. Więc chcę zrobić czek: jeśli oś nie istnieje, to odległość = 0. Nie chcę wstawiać tego do bazy danych, ale po prostu nie potrzebuję już bezużytecznego elementu div ORAZ oś pozostaje na lewo.

Dlaczego tego chcę?
W ten sposób mogę sprawdzić, które numery wózków są takie same, więc mogę dać im każdy inny kolor itp. Również nie będę potrzebował div bezużytecznego!

EDIT:

Proste wyjaśnienie:

Chcę pokazać Axle_nr z tabeli bogie.(W związku z tym wyświetla 4 kółka) ! Będę potrzebował Distance ze stołu axle, aby utworzyć figurę pociągu.
jak widać tabela axle ma 1 oś mniej niż tabelę bogie.
Chcę, aby oś "Nieistniejąca" miała wartość 0. Chcę, żeby była 0, ponieważ wtedy pojawi się na początku pociągu. (Podobnie jak bezużyteczne osi teraz)

CODE EDIT:

Teraz mam to:

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

I:

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

I to pokazuje mi 12 Osie zamiast 4!

EDIT:

to pokazuje mi 4 osie teraz wich jest poprawna. Jednak potrzebuję również prawidłowych odległości. Kod mam:

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

Teraz, to pokazuje mi, że każda oś ma margines 10%. jest to poprawne (jeśli masz tylko pierwszą oś). musi to być coś w rodzaju 10-15-10-15 lub więcej. Jak mam to zrobic?

EDIT:

Teraz mam zapytanie folowing:

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 nazywam go tutaj: EDIT

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

Obrazek:

train example

+2

Wciąż nie dostałem twojego pytania. Proponuję wyjaśnić to prosto. Ludzie mogą ci pomóc. – Ironic

+0

Wykonałem edycję @ 404 – Mitch

Odpowiedz

4

Wydaje mi to wszystko jest dość zawiłym sposobem na obejście pierwotnego problemu. Jesteś nieśmiały jedną osią i potrzebujesz, aby ta oś znajdowała się w twojej bazie danych. Powiedziałeś, że wszystkie wartości są dodawane za pośrednictwem wyzwalacza w bazie danych. W takim przypadku warto dodać wartość, która ma odległość "0" od id pociągu. Da ci to nie tylko oś, ale także renderowany element div.

Jeśli stół wyglądał tak po pokoleniu (proszę mi wybaczyć, jeśli indeks jest wyłączony w niewłaściwym kierunku.Walczę tylko dotyk zrozumieć układ bazy danych):

+---------+----------+------+----------+ 
| axle_id | train_id | axle | distance | 
+---------+----------+------+----------+ 
|  0 |  1 | 0 |  0 | 
|  1 |  1 | 1 |  2500 | 
|  2 |  1 | 2 |  5000 | 
|  3 |  1 | 3 |  2500 | 
+---------+----------+------+----------+ 

Następnie dodaje whould wygenerować wszystkie koła, w tym jeden, który ma pewien margines (lub odległości, jak wspomniano wcześniej) „0”. Z technicznego punktu widzenia masz oś o odległości "0" od frontu pociągu, więc dlaczego nie śledzić jej w bazie danych.

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

Takie podejście zarówno upraszcza, jak i rozwiązuje problem.

+0

tak, chociaż PO twierdzi, że NIE chce przechowywać osi w DB, myślę też, że twoja odpowiedź jest sposobem postępowania. Jeśli pociąg ma 4 osie, umieść tam 4 rzędy i uprość obliczenia! XD – Chococroc

3

Zmień

$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"; 

do

$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"; 

Albo uruchomić do testowania następnej 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 

zwrot 4 rzędy zamiast 12.

+0

To pomogło mi, ciężko dostałem 1 mały problem z tym haha ​​Sprawdź edytuj @ Danila Ganchar – Mitch

+0

Przykład został zaktualizowany. Sprawdź odpowiedź. –

+0

Właściwie nie chcę dodawać 5. Jak widzisz mam odległości w moim stole osi. Robię z tego sumę. więc 2500/25000 * 100 = 10. więc pierwsza oś ma margines-lewo 10%. i muszę to zrobić także z resztą. Problem na razie jest: robi to tylko dla pierwszej osi. więc wynik wynosi 10%, 10%, 10%, 10%. podczas gdy w rzeczywistości powinno być 10%, 20%, 10%, ponieważ mam tam tylko 3 osie. – Mitch

Powiązane problemy