Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: JOIN czy ręcznie? Co lepsze?
Forum PHP.pl > Forum > Bazy danych > MySQL
lukasamd
Witam,
mam pewne pytanie - modyfikuję sobie pewnego CMSa i wszędzie widzę zapytania do bazy oparte na JEFT JOIN (których za bardzo tworzyć nie potrafię). Czy takie zapytania są lepsze niż ręczne wybieranie dokładnych rekordów do pobrania i ręczne wskazywanie powiązań pomiędzy poszczególnymi tabelami (to się chyba zwie iloczyn kartezjański)? Zastanawiam się nad tym co jest wydajniejsze, na 100% nie zawsze wykorzystywane są wszystkie informacje pobierane przy użyciu JOIN'ów...
phpion
Ręczne? Masz na myśli:
  1. SELECT * FROM tabela_1, a tabela_2 b WHERE a.pole=b.pole

zamiast:
  1. SELECT * FROM tabela_1 a LEFT JOIN tabela_2 b ON a.pole=b.pole

? Nie sądzę aby była różnica w wydajności (a już na pewno nie znacząca). JOINy dają zdecydowanie więcej możliwości:
http://dev.mysql.com/doc/refman/5.0/en/join.html
łączenia tabel ze sobą. Moim zdaniem warto z nich korzystać.
lukasamd
Ale w CMSie np. dokładnie wiem jakie wartości są mi potrzebne, czy jest sens wyciągać wszystko? Jeżeli moje podejście (tzn. sądzenie iż JOIN = pobieranie wszystko) jest błędne to sorki ale jeszcze się nimi "nie bawiłem".
AxZx
left join nie sluzy do wskazywania z ktorych kolumn dane maja byc pobierane tylko do wskazywania ktore tabele i jak maja byc dolaczone.
po select wskaz ktore kolumny i z ktorych tabel chcesz pobierac.
sowiq
Cytat(phpion @ 22.09.2008, 13:33:49 ) *
Nie sądzę aby była różnica w wydajności (a już na pewno nie znacząca).


Mylisz się smile.gif Na małych bazach nie jest to zauważalne. Kiedyś miałem przypadek, że robiłem zapytanie do kilku kolumn za pomocą 'WHERE...' + 'GROUP BY'. Po zapełnieniu bazy do ok 200 tys wpisów / tabelę zapytanie wykonywało się... 8 sekund :] Przepisałem to na JOIN'y i przyspieszyło do 1 sek.
jarek_bolo
A ja korzystając z tematu wątku chciał bym zapytać czy dobrze rozumuję różnicę LEFT vs. RIGHT JOIN.
Otóż stosujemy LEFT jeśli z dwóch tabel, które łączymy pierwsza jest rodzicem, a druga, ma w sobie pola odwołujące się do rodzica.
Natomiast jeśli piszemy RIGHT to po prawej stronie musi być tabel rodzic, a po lewej dziecko.



Tak wywnioskowałem czytając doc MySQLa, ale czy dobrze?
Jeśli ktoś zna jakiś ciekawy opis różnicy LEFT vs. RIGHT JOIN to niech zapoda. A INNER JOIN pewnie stosujemy gdy łączymy równorzędne tabele?
dr_bonzo
To nie ma nic wspolnego z rodzicami i dziecmi:

LEFT i RIGHT roznia sie tylko kolejnoscia podania nazw tabel:

  1. FROM tab_1 LEFT JOIN tab_2

do tab_1 dolaczy rekordy z tab_2 lub NULLe

to jest to samo co:

[sql]FROM tab_2 RIGHT JOIN tab_1[sql]
tez do tab_1 dolaczy rekordy z tab_2 lub NULLe


INNER join - dolaczy dane z drugiej tabeli tylko gdy zostanie spelniony warunek ON (LEFT/RIGHT w przypadku niespelnienia dolaczaja same NULLe)
jarek_bolo
Acha, czyli to LEFT bądź RIGHT określa nam z której strony złączenia znajdzie się pierwsza tabela w zapytaniu.
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.