Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> pobierz komentarze + info ile mają odpowiedzi
o_d
post
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 7.12.2007

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


Czy jest możliwe i jeśli tak to jak, wyciągnąć komentarze wraz z informacją ile jest odpowiedzi na te komentarze


Struktura tabelki comments to:

commentID
itemID
userID
comment_date
comment_content
comment_parent

gdzie to własnie comment_parent decyduje o tym, czy dany komentarz jest odpowiedzą i przyjmuje wartości :
* 0 - gry to główny koment - nie odpowida na żadny inny koment
* commentID - identyfikator komentarza na jaki odpowiada


Chciałbym teraz wyciągnąć najnowsze komentarze z comment_parent=0 + miec w osobnej kolumnie info, czy komentarz ma odpowiedzi (a idealnie to ile ma odpowiedzi).

Czy jest to wykonalne 1 zapytaniem?

Jedyne rozwiązanie jakie wymyśliłem, to dodać osobną kolumnę answers_count, gdzie będę zwiększać cyferkę przy każdej dokonanej odpowiedzi. Ale jakoś wydaje mi sie to słabe rozwiązanie :/

Proszę o pomoc.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
mat-bi
post
Post #2





Grupa: Zarejestrowani
Postów: 690
Pomógł: 92
Dołączył: 6.02.2011

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


  1.  
  2. COUNT (commentID) AS ilosc
Go to the top of the page
+Quote Post
o_d
post
Post #3





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 7.12.2007

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


trochę niejasna dla mnie odpowiedź...

jeśli chodziło o np.
  1. SELECT c.*, count(c.commentID) AS ilosc FROM comments AS c WHERE c.itemID='2' ORDER BY c.comment_parent, c.comment_date DESC


to nie daje to oczekiwanego rezutatu (zwraca pojedynczy rekord i na końcu dokleja liczbę wszystkich komentarzy spełniająych warunek c.itemID='2' ).
Go to the top of the page
+Quote Post
BaN
post
Post #4





Grupa: Zarejestrowani
Postów: 158
Pomógł: 43
Dołączył: 9.11.2007

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


wykorzystaj złączenie tej samej tabeli (LEFT JOIN) z tym warunkiem o którym piszesz, czyli że comment_parent wskazuje na odpowiedź
Go to the top of the page
+Quote Post
pmir13
post
Post #5





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


Wbrew pozorom rozwiązanie, które wymyśliłeś, czyli zapisujące ilość odpowiedzi w osobnej kolumnie jest całkiem dobre.
Masz tu klasyczny przypadek drzewa zapisanego jako adjacency list, do tego sam charakter komentarzy sugeruje nieograniczony poziom zagnieżdżenia i w tym wypadku nie jest możliwe podanie liczby odpowiedzi przy pomocy samego sql, gdyż wymagałoby to tyle self-joinów ile wynosi ten poziom.
Krótko mówiąc musiałbyś iterować po całej tabeli i liczyć odpowiedzi albo w procedurze albo w zewnętrznym języku.
Możesz próbować przerobić to na nested sets, ale ten model też ma wady, zwłaszcza przy dużej liczbie dodawanych rekordów, co dla komentarzy jest raczej oczywiste, nested sets lepiej się sprawdza na przykład dla drzewa kategorii produktów, gdzie zmiany w tym drzewie nie są zbyt częste.
Dlatego trzymanie liczby odpowiedzi w osobnej kolumnie jest całkiem rozsądnym rozwiązaniem.
Go to the top of the page
+Quote Post
o_d
post
Post #6





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 7.12.2007

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


wedlug wskazówek BaN:

  1. SELECT c.*, count(cc.commentID) AS ilosc FROM comments AS c LEFT JOIN comments AS cc ON cc.comment_parent = c.commentID WHERE c.comment_approved = 'yes' ORDER BY c.comment_date DESC LIMIT 20

Niestety nadal nie działa. Dostaję 1 wiersz(rekord) i nie wiem co robię nie tak.

Ten post edytował o_d 12.06.2011, 10:30:15
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Brakuje GROUP BY po głównych komentarzach


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
o_d
post
Post #8





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 7.12.2007

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


bardzo dziękuję!
Dla potomnych gotowiec:
  1. SELECT c.*, count( cc.commentID ) AS ilosc FROM comments AS c LEFT JOIN comments AS cc ON cc.comment_parent = c.commentID WHERE c.comment_approved = 'yes' GROUP BY c.commentID ORDER BY c.comment_date DESC LIMIT 20
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 Aktualny czas: 20.08.2025 - 02:07