Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> dwu krotne odwołanie do jednej tabeli
billy235
post
Post #1





Grupa: Zarejestrowani
Postów: 27
Pomógł: 1
Dołączył: 2.10.2007

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
AxZx
post
Post #2





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

Ostrzeżenie: (0%)
-----


dobrze jest. możesz ewentualnie skorzystać ze złączenia LEFT.


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
billy235
post
Post #3





Grupa: Zarejestrowani
Postów: 27
Pomógł: 1
Dołączył: 2.10.2007

Ostrzeżenie: (0%)
-----


rozumiem że chodzi Ci o przypadek w którym jedno z pól jest puste?? czy do czego takie złączenie posłuży??

Ten post edytował billy235 2.12.2008, 21:34:31
Go to the top of the page
+Quote Post
lukasz_os
post
Post #4





Grupa: Zarejestrowani
Postów: 203
Pomógł: 55
Dołączył: 23.11.2008
Skąd: UKF

Ostrzeżenie: (0%)
-----


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.


--------------------
Pomagam jeśli mam czas oraz jak się na tym znam :D
Go to the top of the page
+Quote Post
billy235
post
Post #5





Grupa: Zarejestrowani
Postów: 27
Pomógł: 1
Dołączył: 2.10.2007

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
AxZx
post
Post #6





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

Ostrzeżenie: (0%)
-----


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


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 22:42