Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Konstrukcja zapytania
Forum PHP.pl > Forum > Przedszkole
Jdwind
Witam, mam zapytanie, którym pobieram z bazy z dwóch tabel dane:
  1. "SELECT pl.idplac, pl.rok, pl.miesiac, pl.podstawa, pl.dodatek1, pl.dodatek2, pl.dodatek3, pl.dodatek4, pl.dodatek5, pl.dodatek6, pl.kol10, pl.kol11, pl.kol12, pl.kol13, pl.kol14, pl.kol15, pl.kol16, pl.kol17, pl.kol18, pl.kol19, pl.kol20, pl.kol21, pl.zdrow1, pl.zdrow2, pl.kol22, pl.potr1, pl.potr2, pl.potr3, pl.zaliczka, pl.rodzinne, pl.wyplata, pr.nazwiskoimie FROM pracownicy pr LEFT JOIN place pl ON (pr.idprac = pl.idprac) WHERE pr.idprac ='" .$nazwim ."' AND (pl.rok BETWEEN '" .$rokod ."' AND '" .$rokdo ."') AND (pl.miesiac BETWEEN '" .$miesiacod ."' AND '" .$miesiacdo ."') ORDER BY pr.nazwiskoimie, pl.rok;"

i teraz, jeżeli w tabeli place nie ma rekordu to i tak w wyniku pokazuje jeden wiersz, ponieważ pobiera nazwiskoimie osoby z tabeli pracownicy. Później ładuję nagłówki tabelki i za pomocą while($row = mysql_fetch_array($rezultat)) ładuję wynik (w tym wypadku nazwiskoimie, reszta zawartości tabeli jest pusta. Jak przed załadowaniem nagówków tabelki sprawdzić, że idplac jest puste i nie ładować żadnego wiersza?
b4rt3kk
Musisz zastosować złączenie warunkowe, tzw. "teta". Inaczej mówiąc jeśli chcesz by nie pobierało pustych pól to dodaj warunek id <> NULL.
Jdwind
Wydaje mi się (ale jako newbie oczywiście mogę się mylić), że nie chodzi o zapytanie - bo takim zapytaniem zawsze pobiorę przynajmniej imienazwisko. Chodzi raczej o to, żeby nie wyświetlić wyników, jeśli nie ma idplac dla danej osoby. Czyli najpierw puszczam zapytanie, potem sprawdzam, czy idplac <> "" i ewentualnie wyświetlam dane. Można to sprawdzić czymś w rodzaju mysql_num_rows dla jednego pola, ale zanim zapuszczę while($row = mysql_fetch_array($rezultat))?
PanGuzol
Zamień miejscami tabele w join. Place po lewej a pracownicy po prawej, ewentualnie użyj right join zamiast left
Jdwind
Zamieniłem LEFT na RIGHT i działa dokładnie tak, jak chciałem. Czy dobrze rozumiem, że obecna konstrukcja: ..FROM pracownicy pr RIGHT JOIN place pl ON (pr.idprac = pl.idprac).. mówi mi, że główne dane pobiera z tabeli place, a zależne z tabeli pracownicy, tak?
Bardzo dziękuję za pomoc, guziczek "Pomógł" wciśnięty oczywiście.
PanGuzol
Right join czyli łączy pasujące dane z lewej tabeli do tabeli po prawej. Prawa tabela jest tabelą główną.
Jdwind
Dziękuję jeszcze raz za wyjaśnienie i pomoc.
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.