Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: pobierz komentarze + info ile mają odpowiedzi
Forum PHP.pl > Forum > Bazy danych > MySQL
o_d
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
  1.  
  2. COUNT (commentID) AS ilosc
o_d
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' ).
BaN
wykorzystaj złączenie tej samej tabeli (LEFT JOIN) z tym warunkiem o którym piszesz, czyli że comment_parent wskazuje na odpowiedź
pmir13
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.
o_d
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.
nospor
Brakuje GROUP BY po głównych komentarzach
o_d
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
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-2024 Invision Power Services, Inc.