Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL] Zliczanie wystąpień w powiązanej tabeli, ...to oznacza kłopoty :P
rytek
post
Post #1





Grupa: Zarejestrowani
Postów: 63
Pomógł: 14
Dołączył: 21.01.2009
Skąd: Mszczonów

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


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.

Ten post edytował rytek 29.07.2009, 11:29:11
Go to the top of the page
+Quote Post
sowiq
post
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


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.

Ten post edytował sowiq 29.07.2009, 11:39:19
Go to the top of the page
+Quote Post
rytek
post
Post #3





Grupa: Zarejestrowani
Postów: 63
Pomógł: 14
Dołączył: 21.01.2009
Skąd: Mszczonów

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


Dzięki wielkie za szybki odzew, ale...

Niestety nie działa (IMG:http://forum.php.pl/style_emoticons/default/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


Ten post edytował rytek 29.07.2009, 11:35:11
Go to the top of the page
+Quote Post
sowiq
post
Post #4





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


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.
Go to the top of the page
+Quote Post
rytek
post
Post #5





Grupa: Zarejestrowani
Postów: 63
Pomógł: 14
Dołączył: 21.01.2009
Skąd: Mszczonów

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


Dzięki wielkie! Masz wielkiego plusa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Działa, tylko jeszcze muszę wymyśleć, dlaczego działa nie tak jak potrzeba (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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.

Ten post edytował rytek 29.07.2009, 12:01:59
Go to the top of the page
+Quote Post
sowiq
post
Post #6





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


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.
Go to the top of the page
+Quote Post
rytek
post
Post #7





Grupa: Zarejestrowani
Postów: 63
Pomógł: 14
Dołączył: 21.01.2009
Skąd: Mszczonów

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


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Ę (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował rytek 29.07.2009, 12:18:43
Go to the top of the page
+Quote Post
MatKus
post
Post #8





Grupa: Zarejestrowani
Postów: 63
Pomógł: 3
Dołączył: 27.08.2008

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


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ą (IMG:http://forum.php.pl/style_emoticons/default/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


Ten post edytował MatKus 30.07.2009, 09:34:08
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: 16.09.2025 - 04:17