Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL][SQL]Pomysl na zapytanie
viamarimar
post
Post #1





Grupa: Zarejestrowani
Postów: 303
Pomógł: 1
Dołączył: 24.09.2011

Ostrzeżenie: (10%)
X----


  1. $query = "SELECT ".$prefix."users.*, ".$prefix."logi.*, ".$prefix."dane.* FROM ".$prefix."users JOIN ".$prefix."logi ON ".$prefix."logi.logi_users_id = ".$prefix."users.users_id JOIN ".$prefix."dane ON ".$prefix."dane.dane_users_id = ".$prefix."users.users_id ORDER BY logi_data DESC LIMIT 50";
  2. $result = mysql_query($query) OR die (mysql_error());


mam zapytanie jak powyzej, zwraca ono mi logi z tabeli ".$prefix."logi.* tak jak chce dla zalogowanych uzytkownikow, ale w tabeli logi_users_id =0 mam logi dla nie zalogowanych i jak by to wcisnac w to jedno zapytanie zeby nie rozdzielac tego na kilka? Mozna by dac where z tym wlasnie warunkiem lecz poprzednia czesc przestanie dzialac.. i robi sie zonk

nie ma sposobu by nie rozbijac tego na dwa zapytania?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
SmokAnalog
post
Post #2





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Użyj LEFT JOIN:
  1. $query = "
  2. SELECT ".$prefix."users.*,
  3. ".$prefix."logi.*,
  4. ".$prefix."dane.*
  5. FROM ".$prefix."logi
  6. LEFT JOIN ".$prefix."users
  7. ON ".$prefix."users.users.id = ".$prefix."logi.logi_users_id
  8. LEFT JOIN ".$prefix."dane
  9. ON ".$prefix."dane.dane_users_id = ".$prefix."users.users_id
  10. ORDER BY logi_data DESC
  11. LIMIT 50;
  12. ";


Ten post edytował SmokAnalog 1.03.2015, 17:42:01
Go to the top of the page
+Quote Post
viamarimar
post
Post #3





Grupa: Zarejestrowani
Postów: 303
Pomógł: 1
Dołączył: 24.09.2011

Ostrzeżenie: (10%)
X----


No niby dziala i bardzo dziekuje, a moge wiedziec jaka jest roznica miedzy LEFT JOIN a samym JOIN?
Dopiero ucze sie zapytan pomiedzy tabelami opartych o JOIN, wiec bede wdzieczny o wytlumaczenie.
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #4





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


JOIN działa tak, że łączy tabele na podstawie warunku z ON i tworzy wszystkie możliwe pary spełniające warunki. LEFT JOIN działa bardzo podobnie, ale z tą różnicą, że z tabeli po lewej (stąd LEFT JOIN) w zestawie wyników na pewno będzie przynajmniej jeden rekord.
Go to the top of the page
+Quote Post
viamarimar
post
Post #5





Grupa: Zarejestrowani
Postów: 303
Pomógł: 1
Dołączył: 24.09.2011

Ostrzeżenie: (10%)
X----


no dobra skoro jest takie bardzo duze podobienstwo to czemu na tym przykladzie LEFT JOIN "wziol" tez 0 a samo JOIN tego nie zrobil? samo JOIN laczy tylko to co po ON czyli tak jakby warunek w WHERE a LEFT JOIN cale tabele? i to jest ta roznica?

czyli chyba lepiej uzywac LEFT JOIN.. bo tez lapie ON a dodatkowo bierze wszystkie dane , o ile dobrze zrozumialem ( chyba jest on czesciej uzywany , albo i najczesciej z tego co czytam)

a uzycie RIGHT /LEFT JOIN to juz zamiennosc czy tez ma znaczenie?
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #6





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Częściej się używa JOIN niż LEFT JOIN. LEFT JOIN wziął sobie 0 stąd, że tak jak mówiłem - z tabeli po lewej będziesz miał wszystkie rekordy. Zauważ, że zmieniłem kolejność tabel w Twoim zapytaniu, żeby właśnie elegancko się posłużyć LEFT JOIN. RIGHT JOIN działa tak samo jak LEFT, tylko że na pewno będą wszystkie rekordy z tabeli po prawej. Staram się w miarę możliwości unikać RIGHT JOIN, bo jest nieobecny w standardzie SQL, więc przy ewentualnej zmianie systemu bazy danych będzie mniej roboty.

Innymi słowy, te zapytania są takie same:
  1. SELECT * FROM tabela1 LEFT JOIN tabela2 ON tabela1.kolumna = tabela2.inna_kolumna

  1. SELECT * FROM tabela2 RIGHT JOIN tabela1 ON tabela1.kolumna = tabela2.inna_kolumna
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 18:52