Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Zapytanie złożone czy dwa zapytania
Forum PHP.pl > Forum > Przedszkole
djtomaszq
Mam tabele drużyny:
Id_druzyny -> nazwa

i Tabele terminarz:
Id->id_drużyny_home > id_drużyny_away

Czy da radę wyświetlić jednym zapytaniem zawartość terminarza podmieniajac id_drużyny_away i id_drużyny_home na nazwę z tabeli druzyna?
Home i away jest w relacji z id_drużyny.
Czy zrobić to w dwoch zapytaniach?
nospor
Jedno zapytanie i to sie robi przy pomocy JOIN. W tym wypadku najlepiej LEFT JOIN
djtomaszq
  1. SELECT * FROM terminarz LEFT JOIN tabela ON tabela.id_druzyny = terminarz.id_druzyny_home OR tabela.id_druzyny = terminarz.id_druzyny_away


?
nospor
W tym wypadku dwa LEFT JOIN. Jeden na druzyne home a drugi na away

i w select w podaj aliasy na name z kazdego jOINa bo ci sie wprzeciwnym wypadku nadpisza
djtomaszq
Coś takiego?
  1. "SELECT terminarz.*, alias1.nazwa as home, alias2.nazwa as away FROM terminarz JOIN druzyna alias1 ON alias1.id = terminarz.id_druzyny_home JOIN druzyna alias2 ON alias2.id = terminarz.id_druzyny_away"


.. czyli wywołując mogę aliasem (jak niżej) a nie $wiersz['nazwa'] dwa razy?

  1. $wiersz = $zapytanie->fetch_assoc();
  2.  
  3. echo $wiersz['home']." - ".$wiersz['away'];
nospor
Tak, dokładnie. Choc ja osobiscie bym uzyl LEFT JOIN zamiast JOIN. Zawsze to bezpieczniej jak z jakiegos powodu zniknie ci rekord z tabeli druzyna
djtomaszq
Hmm czyli jeśli zrobie LEFT JOIN to jak mi z tabeli druzyny zniknie w np. 2 id nazwa="Legia" to w kodzie w tym miejscu pokaże mi się napis "NULL" ? a jeśli ta sama sytuacja będzie w samym JOIN to wyskoczy błąd ?

.. i czy jeśli dodam tabele "kolejka" -> id/kolejka/id_pauza/data
gdzie "id_pauza' to będzie id druzyny z tabeli druzyny

to tak samo muszę zrobić alias pausa, JOINA i wywoływać $wiersz['pauza'] ?
nospor
Cytat
Hmm czyli jeśli zrobie LEFT JOIN to jak mi z tabeli druzyny zniknie w np. 2 id nazwa="Legia" to w kodzie w tym miejscu pokaże mi się napis "NULL" ? a jeśli ta sama sytuacja będzie w samym JOIN to wyskoczy błąd ?
Tak, z LEFT JOIN dostaniesz NULL. Z samym JOIN nie bedziesz mial bledu zapytania, ale tez nie pobierze ci rekordu z tabeli terminarz jesli nie bedzie istnialo zlaczenie.

Co do pauza to tak jak napisales
djtomaszq
Coś zrobiłem źle..
  1. "SELECT terminarz.*, alias1.nazwa as home, alias2.nazwa as away alias3.nazwa as pauza FROM terminarz
  2. LEFT JOIN druzyna alias1 ON alias1.id = terminarz.id_druzyny_home
  3. LEFT JOIN druzyna alias2 ON alias2.id = terminarz.id_druzyny_away
  4. LEFT JOIN druzyna alias3 ON alias3.id = kolejka.id_pauza"
  5.  


ani tak.

"SELECT kolejka.*, terminarz.*, alias1.nazwa as home, alias2.nazwa as away alias3.nazwa as pauza
FROM kolejka, terminarz
LEFT JOIN druzyna alias1 ON alias1.id = terminarz.id_druzyny_home
LEFT JOIN druzyna alias2 ON alias2.id = terminarz.id_druzyny_away
LEFT JOIN druzyna alias3 ON alias3.id = kolejka.id_pauza"

błąd taki
  1. Exception: Unknown column 'kolejka.id_pauza' in 'on clause'


ale kolumna istnieje i zadeklarowałem ją..
nospor
Ale z czym sie laczy kolejka i co to w ogole jest? Jestem laikiem sportowym wink.gif
djtomaszq
Tabela "kolejka" zawiera id tej kolejki, nazwe kolejki itd. a id_pauze to jest druzyna która puzuje i ma relacje w tabeli drużyny z id i chciałem żeby zamiast id_pauze pokazywało jej odpowiednik nazwy z tabeli druzyny kolumny "nazwa"

a ta tabela ogolnie zawiera wiersze po 1 kolejce meczy, po 2 kolejce meczy itd

id - kolejka - sezon - id_pauze - data
1 - 1 - 1 - 6 - 12/12/2016
2 - 2 - 1 - 9 - 19/12/2016
3 - 3 - 1 - 3 - 26/12/2016
4 - 4 - 1 - 10 - 02/01/2017
nospor
No ale jak sie ma kolejka do teminarza? Bo teraz to nie ma sensu dla mnie
djtomaszq
W terminarzu jest kolumna id_kolejki i relacja z id w tabeli kolejka
To pokazuje w jakiej kolejce grają druzyny z tego wiersza tabeli
nospor
A, teraz to ma sens

  1. SELECT terminarz.*, alias1.nazwa AS home, alias2.nazwa AS away, druzynakolejka.nazwa AS pauza FROM terminarz
  2. LEFT JOIN druzyna alias1 ON alias1.id = terminarz.id_druzyny_home
  3. LEFT JOIN druzyna alias2 ON alias2.id = terminarz.id_druzyny_away
  4. LEFT JOIN kolejka ON kolejka.id = terminarz.id_kolejki
  5. LEFT JOIN druzyna druzynakolejka ON druzynakolejka.id = kolejka.id_pauza
djtomaszq
Czyli mój błąd polegał na tym, że nie zrobiłem przypisania 4 linijki... (?)

HM a dlaczego mi nie działało jak robiłem to w WHERE kolejka.id = terminarz.id_kolejki Twóją 4 linijkę z powyższego postu ? Czy jak się JOIN używa to tylko tego trzeba?


.. i czy jest w mysql coś takiego co z powyższego zapytania wyświetli mi tylko raz jeden rekord który się powtarza?

np. w tabeli terminarz nazwa każdej kolejki pokazuje się 6 razy tak samo data no bo jest tak przypisana w bazie a chce żeby tylko wyświetliła się raz na górze potem wszytkie 6 wierszy z różnymi druzynami które grają miedzy sobą i po 6 wierszach nastepny numer kolejki i kolejne 6 wierszy itd. czy to już muszę kombinować w php z pętlami i warunkami ?

.. bo ogólnie wyświetlam wszystko tak:
  1. while($wiersz = $zapytanie->fetch_assoc()){
  2. echo $wiersz['data']."<br /> ";
  3. echo $wiersz['pauza']."<br /> ";
  4. echo $wiersz['godzina']." ".$wiersz['home']." ".$wiersz['gol_home'].":".$wiersz['gol_away']." ".$wiersz['away']."<br />";
  5. }
nospor
Cytat
Czyli mój błąd polegał na tym, że nie zrobiłem przypisania 4 linijki... (?)
tak

Cytat
HM a dlaczego mi nie działało jak robiłem to w WHERE kolejka.id = terminarz.id_kolejki Twóją 4 linijkę z powyższego postu ? Czy jak się JOIN używa to tylko tego trzeba?
Poniewaz gdy masz kilka tabel w FROM to wszystkie tabele we FROM musza byc w nawiasie. W przeciwnym wypadku tylko ostatnia jest widziana w sekcjach JOIN

Cytat
i czy jest w mysql coś takiego co z powyższego zapytania wyświetli mi tylko raz jeden rekord który się powtarza?
Obrobka w php
http://nospor.pl/grupowanie-wynikow.html
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.