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.
mat-bi
13.05.2011, 15:25:56
COUNT (commentID) AS ilosc
trochę niejasna dla mnie odpowiedź...
jeśli chodziło o np.
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' ).
wykorzystaj złączenie tej samej tabeli (LEFT JOIN) z tym warunkiem o którym piszesz, czyli że comment_parent wskazuje na odpowiedź
pmir13
15.05.2011, 18:50:24
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.
wedlug wskazówek BaN:
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.
nospor
12.06.2011, 11:28:25
Brakuje GROUP BY po głównych komentarzach
bardzo dziękuję!
Dla potomnych gotowiec:
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
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.