Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> LEFT JOIN i podwójny COUNT
chmiello96
post 1.10.2012, 23:38:28
Post #1





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 18.03.2012

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


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

Ten post edytował chmiello96 2.10.2012, 16:29:16
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
mmmmmmm
post 2.10.2012, 07:09:43
Post #2





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


GROUP BY post_id, post_content
Go to the top of the page
+Quote Post
sowiq
post 2.10.2012, 08:00:50
Post #3





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

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


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).

Ten post edytował sowiq 2.10.2012, 08:01:08
Go to the top of the page
+Quote Post
chmiello96
post 2.10.2012, 15:55:11
Post #4





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 18.03.2012

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


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. +------------+--------------+--------------+--------------+
Go to the top of the page
+Quote Post
mmmmmmm
post 2.10.2012, 19:11:39
Post #5





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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
Go to the top of the page
+Quote Post
sowiq
post 2.10.2012, 20:02:17
Post #6





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

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


@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ą.
Go to the top of the page
+Quote Post
chmiello96
post 2.10.2012, 20:57:09
Post #7





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 18.03.2012

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


a czy umiecie mi pomóc z nowym problem ? :/
Go to the top of the page
+Quote Post
mmmmmmm
post 3.10.2012, 07:23:08
Post #8





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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
Go to the top of the page
+Quote Post
sowiq
post 3.10.2012, 07:46:36
Post #9





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

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


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.

Ten post edytował sowiq 3.10.2012, 09:07:41
Go to the top of the page
+Quote Post
chmiello96
post 3.10.2012, 15:02:25
Post #10





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 18.03.2012

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


tak z ciekawości
co oznacza w sortowaniu 1 i 2 ?
Go to the top of the page
+Quote Post
sowiq
post 3.10.2012, 15:06:39
Post #11





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

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


Cytat(chmiello96 @ 3.10.2012, 16:02:25 ) *
co oznacza w sortowaniu 1 i 2 ?


http://stackoverflow.com/questions/7392730...group-by-1-mean
Go to the top of the page
+Quote Post
chmiello96
post 3.10.2012, 22:52:03
Post #12





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 18.03.2012

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


@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 :/
Go to the top of the page
+Quote Post
mmmmmmm
post 4.10.2012, 18:48:44
Post #13





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


  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


Ten post edytował mmmmmmm 4.10.2012, 18:49:17
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 05:12