Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Zliczanie wystąpień w powiązanej tabeli
Forum PHP.pl > Forum > Bazy danych > MySQL
rytek
Witam.

Mam problem z kwerendą mysql.

Mój problem wygląda następująco:
Muszę pobrać tylko te rekordy z tabeli1, które mają swoje odpowiedniki w tabeli2 (pole id), przy czym chcę pobierać 5 kolejnych rekordów, począwszy od x.

Mój kod wygląda następująco:

  1. SELECT *, count(tabela2.id) ilosc FROM prefix_artykuly_glowna WHERE prefix_artykuly_glowna.typ='T' AND prefix_artykuly_glowna.typ='T'
  2. ORDER BY prefix_artykuly_glowna.id DESC LEFT JOIN prefix_segregator_glowna tabela2 ON tabela2.id=prefix_artykuly_glowna.id
  3. GROUP BY prefix_artykuly_glowna.id
  4. LIMIT 0, 5


Lecz niestety nie działa. Nie wiem co jest źle i czy w ogóle da się coś takiego zrobić.
Proszę o pomoc.

Pozdrawiam, Rytek.
sowiq
Poprawiona wersja:
  1. SELECT *, count(tabela2.id) [b]AS[/b] ilosc
  2. FROM prefix_artykuly_glowna
  3. [b][s]LEFT[/s] JOIN prefix_segregator_glowna tabela2 ON tabela2.id=prefix_artykuly_glowna.id[/b]
  4. WHERE prefix_artykuly_glowna.typ='T'
  5. [s]AND prefix_artykuly_glowna.typ='T'[/s]
  6. GROUP BY prefix_artykuly_glowna.id
  7. ORDER BY prefix_artykuly_glowna.id DESC LIMIT 0, 5


Twoje błędy:
1. Zabrakło AS w pierwszej linijce
2. LEFT JOIN w złym miejscu, powinien być po FROM ...
3. LEFT jest niepotrzebne, bo: Muszę pobrać tylko te rekordy z tabeli1, które mają swoje odpowiedniki w tabeli2
4. Dwa razy dałeś warunek prefix_artykuly_glowna.typ='T'

Tak z grubsza. Nie wiem czy będzie działało, ale błędami składni sypać już nie powinno.
rytek
Dzięki wielkie za szybki odzew, ale...

Niestety nie działa sad.gif

  1. SELECT *, count(tabela2.id) AS ilosc
  2. FROM prefix_artykuly_glowna JOIN prefix_segregator_glowna tabela2 ON tabela2.id=prefix_artykuly_glowna.id
  3. WHERE prefix_artykuly_glowna.typ='T' ORDER BY prefix_artykuly_glowna.id DESC GROUP BY prefix_artykuly_glowna.id LIMIT 0, 5


Cytat
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY prefix_artykuly_glowna.id LIMIT 0, 5' at line 5
sowiq
Sorry, mój błąd. Oczywiście najpierw GROUP BY , a dopiero później ORDER BY. Już poprawiłem kod w moim poprzednim poście.
rytek
Dzięki wielkie! Masz wielkiego plusa smile.gif

Działa, tylko jeszcze muszę wymyśleć, dlaczego działa nie tak jak potrzeba tongue.gif
Mianowicie pobiera mi rekordy z prefix_segregator_glowna, które nie mają odpowiedników w prefix_artykuly_glowna.
A ja próbuję zrobić, by pobierało z prefix_artykuly_glowna te, które mają odpowiedniki w prefix_segregator_glowna.

Ale z bardziej rozbudowanych zapytań jestem noga jak na razie tongue.gif


OK, odwróciłem zapytanie, wydaje się prawidłowo... ale jest inny problem.
Pokażę to na przykładzie:

rekord 1 nie ma odpowiednika w tabeli 2 -> nie zostanie pobrany
rekord 2 nie ma odpowiednika w tabeli 2 -> nie zostanie pobrany
rekord 3 nie ma odpowiednika w tabeli 2 -> nie zostanie pobrany
rekord 4 nie ma odpowiednika w tabeli 2 -> nie zostanie pobrany
rekord 5 nie ma odpowiednika w tabeli 2 -> nie zostanie pobrany
rekord 6 ma odpowiednika w tabeli 2 -> też nie zostanie pobrany, bo jest limit do rekordów...

Ja potrzebuję właśnie obejść to do 5 wyświetlonych rekordów, z tym, że byłoby to proste, o ile mógłbym tutaj posłużyć się PHP, ale nie mogę, bo porypie się stronicowanie... Tzn, będzie wyświetlało więcej stron niż należy.
sowiq
Cytat(rytek @ 29.07.2009, 12:51:15 ) *
[...]pobiera mi rekordy z prefix_segregator_glowna, które nie mają odpowiedników w prefix_artykuly_glowna.
A ja próbuję zrobić, by pobierało z prefix_artykuly_glowna te, które mają odpowiedniki w prefix_segregator_glowna.
No właśnie JOIN działa dokładnie tak, jak potrzebujesz. Na pewno nie wstawiłeś jakiegoś RIGHT/LEFT JOIN'a?

Dla testu wywal GROUP BY i COUNT() i zobacz jakie rekordy Ci zwróci.
rytek
Po przywróceniu poprzedniego i wywaleniu group by i count nadal jest wszystko.

  1. SELECT *
  2. FROM fusion_artykuly_glowna JOIN fusion_segregator_glowna tabela2 ON tabela2.id=fusion_artykuly_glowna.id
  3. WHERE fusion_artykuly_glowna.typ='T'
  4. ORDER BY fusion_artykuly_glowna.id DESC LIMIT 0, 5



Już wszystko działa, skapnąłem się dopiero teraz, że id z 1 tabeli != id z drugiej, tj. powiązanie jest po innym polu.

Wszystko działa, DZIĘKUJĘ smile.gif
MatKus
Jako, że akurat siedze nad czymś podobnym, to nie będę zakładał nowego tematu.
Otóż też próbuję wyciągnąć ilość rekordów z powiązanej tabeli. I w sumie działa poprawnie, ale tylko pod warunkiem, że ilość ta nie jest zerowa.
  1. SELECT product_categories.*, count(products_in_categories.category_id) AS ilosc
  2. FROM product_categories JOIN products_in_categories ON product_categories.id=products_in_categories.category_id
  3. GROUP BY name
  4. ORDER BY name


Jak mogę to zmienić, żeby wyrzuciło mi też elementy, które nie mają wystąpień w powiązanej tabeli i z informacją właśnie, że takowych jest właśnie 0.
[edit]OK, problem już rozwiązałem. Google twoim przyjacielem, jak to mówią smile.gif
Nie wiem, na ile to jest optymalne, pewnie nie zbyt ze względu na zagnieżdżony select, ale działa, więc dla potomności:
  1. (SELECT `product_categories`.*, count(`products_in_categories`.category_id) AS ilosc
  2. FROM `product_categories` JOIN `products_in_categories` ON `product_categories`.id=`products_in_categories`.category_id
  3. GROUP BY name
  4. )
  5. UNION
  6. (
  7. SELECT `product_categories`.*, 0 AS ilosc
  8. FROM `product_categories` WHERE `product_categories`.id NOT IN (SELECT category_id FROM `products_in_categories`)
  9. )
  10. ORDER BY name
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.