Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dwu krotne odwołanie do jednej tabeli
Forum PHP.pl > Forum > Bazy danych > MySQL
billy235
Witam,
mam dwie tabele:
-osoby (pola: id_osoby, imie, id_miejscowosci_gdzie_mieszka, id_miejscowosci_gdzie_sie_urodzil)
-miejscowosci (pola: id_miejscowosci, nazwa)
wszystkie pola są not null

Chwiałbym uzyskać dane w takiej postaci:
id_osoby|imie|nazwa miejscowosci w ktorej mieszka|nazwa miejscowosci gdzie sie urodził|

Napisałem takie zapytanie:

SELECT o.imie, mieszka.nazwa, urodzony.nazwa
FROM osoby o, miejscowosci mieszka, miejscowosci urodzony
WHERE o.id_miejscowosci_gdzie_mieszka=mieszka.id_miejscowosci
AND o.id_miejscowosci_gdzie_sie_urodzil=urodzony.id_miejscowosci

Wydaje mi się że to zapytanie działa poprawnie.
ale moje pytanie jest takie czy jest to zgodne ze standardami mysql oraz co za tym idzie czy następna wersja mysql nie odrzuci mi takiego zapytania.
AxZx
dobrze jest. możesz ewentualnie skorzystać ze złączenia LEFT.
billy235
rozumiem że chodzi Ci o przypadek w którym jedno z pól jest puste?? czy do czego takie złączenie posłuży??
lukasz_os
Hmm takie zapytanie jakie ty ulozyles jest raczej malo optymalne. Gdyz na zlaczeniach baza pracuje szybciej. Majac tabele:
z nazwami miast(dwa): id,nazwa z 3 wierszami oraz z osobami (jeden):id,nazwa,id_1,id_2 z dwoma krotkami otrzymałem takie same wyniki po wykonaniu dwoch zapytan z tym ze:
  1. SELECT j.nazwa, d1.nazwa, d2.nazwa
  2. FROM jeden j, dwa d1, dwa d2
  3. WHERE j.id_1 = d1.id AND j.id_2 = d2.id;

Dane z phpmyadmin:Pokaż rekordy 0 - 1 (2 wszystkich, Wykonanie zapytania trwało 0.0006 sekund(y))

  1. SELECT j.nazwa, d1.nazwa, d2.nazwa
  2. FROM jeden j
  3. LEFT JOIN dwa d1 ON ( j.id_1 = d1.id )
  4. LEFT JOIN dwa d2 ON ( j.id_2 = d2.id ) ;

Dane z phpmyadmin:Pokaż rekordy 0 - 1 (2 wszystkich, Wykonanie zapytania trwało 0.0005 sekund(y))

Moze to malo na takie testowanie ale sprawdz u siebie jak bedzie z ta wydajnascia. Moim zdaniem drugi sposob powinien dzialac szybciej.

Pozdrawiam.
billy235
dzięki wam obu za pomoc jak baza będzie skończona i trochę bardziej wypełniona to też zmierzę w ten sposób szybkość.
Teraz jak dokonuje testu a jest tam raptem 10 rekordów to nie widzę różnicy odświeżając każde zapytanie po kilka razy uzyskuje średnio po 0,0004s.
AxZx
Cytat(lukasz_os @ 2.12.2008, 21:54:26 ) *
Hmm takie zapytanie jakie ty ulozyles jest raczej malo optymalne. Gdyz na zlaczeniach baza pracuje szybciej.


żeby była jasność to zapytanie, które ułożył autor tematu też wykorzystuje złączenie - zwykły JOIN, to jest coś jak INNER JOIN.

LEFT JOIN będzie lepszy do wyświetlania użytkowników, bo jak ktoś nie poda miasta to będzie miał po prostu puste pole ale się wyświetli. przy inner join już go nie będzie w wynikach.
to tylko takie małe info:)
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.