Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z zapytaniem z LEFT JOIN
Forum PHP.pl > Forum > Bazy danych > MySQL
Sm0key
Witam mam 2 tabele ::

faktury
-idf
-Do_kogo ( relacja z tabela osoby )
-Idk

0raz

osoby
-id
-osoba (nazwisko i imie )

i teraz chce aby mi pokazalo wszytkie osoby oraz ile faktur jest do nich z danej firmy , chce aby pozkazywalo nawet gdy nie ma do danej osoby zadnej faktury i zrobilem zapytanie dry.gif ::

  1. SELECT s.osoba , count(Do_kogo) AS ile , f.idk
  2. FROM faktury
  3. f , osoby s LEFT JOIN osoby ON ( f.Do_kogo = s.id ) WHERE f.idk = 22 GROUP BY s.osoba
  4. ORDER BY ile DESC


no i pokazuje dobrze ale ile jest magiczna liczba a przy osobach gdzie nie ma do nich faktur tez sa jakie liczby blink.gif tak jakby byla petla i dodawalo je kilka razy worriedsmiley.gif
nospor
  1. ....
  2. FROM faktury
  3. f , osoby s
a potem jeszcze raz joinujesz osoby...
pobieraj dane tylko z osoby (from osoby) a joinuj faktury. wkoncu to moze nie byc faktury dla osoby a nie na odwrot.
Sm0key
chyba troszke tego nei rozumiem sad.gif

  1. SELECT s.osoba , count(f.Do_kogo) AS ile , f.idk
  2. FROM osoby
  3. s LEFT JOIN faktury f ON ( s.id = f.Do_kogo)
  4. WHERE f.idk = 22 GROUP BY f.Do_kogo
  5. ORDER BY ile DESC


i pokazuje mi tylko 2 osoby dla których sa faktury sad.gif
nospor
bo żle grupujesz:group by f.Do_kogo
powinno byc: group by s.id

teraz powinno chwycic smile.gif
Sm0key
No to mam tak ::

  1. SELECT s.id , s.osoba , count(f.Do_kogo) AS ile
  2. FROM osoby
  3. s JOIN faktury f ON (s.id = f.Do_kogo) WHERE f.idk = 22
  4. GROUP BY s.id
i teraz pokazuje 2 osoby sad.gif(

moze to count(f.Do_kogo) trzeba gdzie indziej umiescic questionmark.gif
nospor
w sposob brutalny zmusiles mnie do uruchomienia mysql i przetestowania winksmiley.jpg
U mnie dziala smile.gif

Twoim bledem jest to, ze dajesz warunek na fakturę. a przeciez jesli faktury nie ma, to i pole z fakturą nie istnieje. mala poprawka:

  1. ... WHERE f.idk = 22 OR f.idk IS NULL ....
Sm0key
  1. SELECT s.id , s.osoba , count(f.Do_kogo) AS ile
  2. FROM osoby
  3. s JOIN faktury f ON (s.id = f.Do_kogo) WHERE f.idk = 22 OR f.idk IS NULL
  4. GROUP BY s.id ORDER BY ile DESC


u mnie cos nie tak albio ja zle rozumiem sad.gif( jestem za withstupidsmiley.gif
nospor
ale co cos nie tak? To co pokazales powinno dzialac juz dobrze.

pokaz zapytania tworzące tabele
pokaz zapytania dodające dane do tych tabel (jesli jest ich tylko kilka) winksmiley.jpg
sprawdze se u siebie. bo ja stworzylem u siebie tabele na twoje podobienstwo i mi dziala. mam 3 osoby, tylko dla dwoch jest faktura, a wyswietla mi te 3 osoby i przy tej jednej jest napisane 0 faktur. czyli tak jak chciales, tak? dodalem sobie nawet warunek co ty masz i wszystko jest wporządku
Sm0key
  1. SELECT s.id , s.osoba, count(f.idk)
  2. FROM osoby
  3. s LEFT JOIN faktury f ON (s.id = f.Do_kogo) WHERE f.idk = 22 OR f.Do_kogo IS NULL
  4. GROUP BY s.id


cos namerdalem ale takie cos działa

a dokładnie :::
  1. SELECT s.id , s.osoba, count(f.idk) AS ile
  2. FROM osoby
  3. s LEFT JOIN faktury f ON (s.id = f.Do_kogo) WHERE f.idk = 22 OR f.Do_kogo IS NULL
  4. GROUP BY s.id ORDER BY ile DESC


teraz pokazuje jak trzeba blink.gif

Twoje też działa bardzo dziekuje jeszcze laik ze mnie sad.gif
nospor
eeee... ty pousuwales pozniej left join i zostawiles samo join. nie zauwazylem ze tak zrobiles
teraz przywrociles left join to ci dziala winksmiley.jpg. ja caly czas myslalem ze masz wlasnie left join
Sm0key
jest maly problem ...

nie pokazuje wszytkich sad.gif osob .. tylko te które maja null całkowity i co była do nich faktura z tej firmy .. a osoby które miały fakture byle jaką ale nie miały z tej firmy (idf) to ich nie widac sad.gif(
nospor
no a czemu sie dziwisz? przeciez dales warunek : where f.idk = 22.... jak chcesz niezaleznie od faktur to usun ten warunek. wowczas i ten z nullem bedzie tez niepotrzebny
Sm0key
tylko sie o to rozchodzi zeby pokazac wszytkie osoby i policzyc ile z danej firmy faktur jest do osoby ... moze jakies inne rozwiazanie jest tego sad.gif

  1. SELECT o.id , o.osoba , sum( IF(f.idk = "22",1,0) ) AS test
  2.  
  3. FROM osoby
  4. o
  5. LEFT JOIN faktury f ON (o.id = f.Do_kogo)
  6.  
  7. GROUP BY o.id ORDER BY test DESC ;

wy,yslilem cos takiego

jak by ktos mial inna propozycje bardzo chetnie zobacze i potestuje
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-2024 Invision Power Services, Inc.