Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: LEFT JOIN i podwójny COUNT
Forum PHP.pl > Forum > Bazy danych > MySQL
chmiello96
Potrzebuję zapytania, które do postów dopasuje liczbę przeczytań
Moje zapytanie zdaje się być dobre, lecz jednak jest coś źle
(tabela "readd" została tak nazwana umyślnie)

MOJE ZAPYTANIE
  1. SELECT post_id, post_content, COUNT( read_post )
  2. FROM post
  3. LEFT JOIN readd ON read_post = post_id
  4. GROUP BY read_post


DANE
  1. +---------+--------------+
  2. | post_id | post_content |
  3. +---------+--------------+
  4. | 1 | KoK |
  5. | 2 | Konten |
  6. | 3 | Testowy |
  7. +---------+--------------+
  8.  
  9.  
  10. +---------+-----------+-----------+-----------+
  11. | read_id | read_user | read_post | read_time |
  12. +---------+-----------+-----------+-----------+
  13. | 1 | 1 | 1 | 123213212 |
  14. | 2 | 2 | 1 | 123212223 |
  15. +---------+-----------+-----------+-----------+


OCZEKIWANY EFEKT

  1. +---------+--------------+--------------------+
  2. | post_id | post_content | COUNT( read_post ) |
  3. +---------+--------------+--------------------+
  4. | 1 | KoK | 2 |
  5. | 2 | Konten | 0 |
  6. | 3 | Testowy | 0 |
  7. +---------+--------------+--------------------+


EFEKT MOJEGO ZAPYTANIA
  1. +---------+--------------+--------------------+
  2. | post_id | post_content | COUNT( read_post ) |
  3. +---------+--------------+--------------------+
  4. | 2 | Konten | 0 |
  5. | 1 | KoK | 2 |
  6. +---------+--------------+--------------------+


Będę wdzięczny za każdą pomoc smile.gif
mmmmmmm
GROUP BY post_id, post_content
sowiq
Nie grupuj po post_content, jak Ci poradził mmmmmmm, bo grupowanie po kolumnach tekstowych jest dużo bardziej kosztowne niż po liczbowych.

Twoje zapytanie działa źle, ponieważ dla post_id = 2 i post_id = 3 nie istnieją rekordy w readd, w związku z czym po wykonaniu JOIN'a read_post będzie miało wartość NULL w obu przypadkach. Więc rekordy te zostaną zgrupowane razem.

Rozwiązanie Twojego problemu to grupowanie po post.post_id (w Twoim przypadku - post_id, ale polecam dodawać aliasy tabel do zapytań - łatwiej się czyta).
chmiello96
a idąc dalej
co musiałbym zrobić, żeby otrzymać do tego jeszcze liczbę komentarzy ?
  1. +------------+--------------+--------------+--------------+
  2. | comment_id | comment_user | comment_post | comment_time |
  3. +------------+--------------+--------------+--------------+
  4. | 1 | 3 | 2 | 123213212 |
  5. | 2 | 4 | 3 | 123212223 |
  6. +------------+--------------+--------------+--------------+
mmmmmmm
sowiq - jesteś w błędzie twierdząc, że takie zapytanie przejdzie. Owszem, w pewnych warunkach na MySQL przejdzie i czasem nawet dobre wyniki zwraca, ale zazwyczaj nie. Jest to chyba jedyna znana mi baza, która dopuszcza stosowanie kolumn w grupowaniu bez użycia ich albo w agregatach, albo w hrupowaniu. Zresztą zależy to od jednego parametru, który bodajże w ostatnich wersjach ma inną wartość domyślną. http://dev.mysql.com/doc/refman/5.1/en/ser...y_full_group_by
sowiq
@mmmmmmm, nie rozumiem o czym do mnie piszesz. Czy ja gdzieś podałem całe zapytanie? :| Podpowiedziałem tylko autorowi, żeby grupował wyniki po post_id, a nie po post_content, bo grupowanie po polu tekstowym jest pamięciowo kosztowną operacją.
chmiello96
a czy umiecie mi pomóc z nowym problem ? :/
mmmmmmm
Cytat(sowiq @ 2.10.2012, 21:02:17 ) *
@mmmmmmm, nie rozumiem o czym do mnie piszesz. Czy ja gdzieś podałem całe zapytanie? :| Podpowiedziałem tylko autorowi, żeby grupował wyniki po post_id, a nie po post_content, bo grupowanie po polu tekstowym jest pamięciowo kosztowną operacją.

Kazałeś mu wywalić z grupowania pole post_content. Więc w zapytaniu znajdzie się pole, które nie będzie stałą, nie będzie grupowania po nim, ani nie będzie agregatem. Dalej już znasz...

Cytat(chmiello96 @ 2.10.2012, 16:55:11 ) *
a idąc dalej
co musiałbym zrobić, żeby otrzymać do tego jeszcze liczbę komentarzy ?
  1. +------------+--------------+--------------+--------------+
  2. | comment_id | comment_user | comment_post | comment_time |
  3. +------------+--------------+--------------+--------------+
  4. | 1 | 3 | 2 | 123213212 |
  5. | 2 | 4 | 3 | 123212223 |
  6. +------------+--------------+--------------+--------------+

  1. SELECT p.post_id, p.post_content, COUNT( r.read_post ) przeczytanych, COUNT(c.comment_user) komentarzy, COUNT(DISTINCT c.comment_user) komentatorów
  2. FROM post p
  3. LEFT JOIN readd r ON r.read_post = p.post_id
  4. LEFT JOIN comments c ON p.post_id=c.comment_post
  5. GROUP BY 1,2
sowiq
Cytat(mmmmmmm @ 3.10.2012, 08:23:08 ) *
Kazałeś mu wywalić z grupowania pole post_content. Więc w zapytaniu znajdzie się pole, które nie będzie stałą, nie będzie grupowania po nim, ani nie będzie agregatem. Dalej już znasz...

Kolego, nie spinaj się tak. Nic nikomu nie kazałem, po prostu poradziłem autorowi po jakim polu powinien grupować swoje zapytanie.

Nie wiem jak Ty, ale ja staram się nie dawać gotowych rozwiązań. Otrzymanie porady na forum nie oznacza brak konieczności myślenia, nie sądzisz? Ale to już od autora zależy czy ewentualny komunikat błędu wklei do Google, czy z powrotem na forum.

Dla mnie eot, bo szkoda czasu na takie dyskusje.

Pozdrawiam.


@mmmmmmm, przepraszam, masz rację. Dopiero do mnie dotarło, że dałeś grupowanie po post_id, post_content. Na samym początku źle przeczytałem i cały czas w zaparte myślałem, że zgrupowałeś po read_post, post_content, co dla mnie nie miało najmniejszego sensu.

Oczywiście, jak napisałeś, według standardu SQL grupowanie powinno odbywać się po wszystkich kolumnach wymienionych w liście pól.

Pozdrawiam.
chmiello96
tak z ciekawości
co oznacza w sortowaniu 1 i 2 ?
sowiq
Cytat(chmiello96 @ 3.10.2012, 16:02:25 ) *
co oznacza w sortowaniu 1 i 2 ?


http://stackoverflow.com/questions/7392730...group-by-1-mean
chmiello96
@mmmmmmm

zapytanie działa, ale tylko, jeśli komentarzy i przeczynań jest po 1
Później wyniki są jakoś pomnożone i równe sobie np. jeśli są 2 przeczytania i 3 razy skomentowane zapytanie zwraca mi wynik 6 dla obu elementów :/
mmmmmmm
  1. SELECT p.post_id, p.post_content, COUNT(DISTINCT r.read_id) przeczytanych, COUNT(DISTINCT c.comment_id) komentarzy, COUNT(DISTINCT c.comment_user) komentatorów
  2. FROM post p
  3. LEFT JOIN readd r ON r.read_post = p.post_id
  4. LEFT JOIN comments c ON p.post_id=c.comment_post
  5. GROUP BY 1,2
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.