Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Zliczanie komentarzy przy pobieraniu newsa
Forum PHP.pl > Forum > Przedszkole
l0ud
Witam, mam taki problem:

2 tabelki mysql (news, comments) utworzone w ten sposób:

  1. CREATE TABLE news (
  2. id int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  3. topic varchar(250) NOT NULL,
  4. contents text NOT NULL,
  5. autoformat tinyint NOT NULL,
  6. datetime char(16) NOT NULL
  7. );
  8.  
  9. CREATE TABLE comments (
  10. id int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  11. username char(50) NOT NULL,
  12. mail char(50),
  13. type tinyint UNSIGNED NOT NULL,
  14. contents text NOT NULL,
  15. datetime char(16) NOT NULL
  16. );


I teraz chcę jednym zapytaniem pobrać newsy wraz z ilością komentarzy dla każdego. Kombinuję w ten sposób:
  1. SELECT COUNT(comments.id),news.id,news.contents,news.topic,news.datetime,news.autoformat
  2. FROM news,comments GROUP BY news.id ORDER BY id DESC


Ale nie działa :/

Proszę o pomoc smile.gif
Cienki1980
Jak na moje skromne oko brakuje Ci powiązania między tabelami, które będzie pokazywało które commenty są przypisane do danego news'a.

dodatkowa kolumna w tabeli comments powinna zalatwic sprawe.

Potem wystarczy wykorzystać w zapytaniu JOIN i powinno zwracać to co trzeba.
l0ud
Heh, faktycznie, dopiero teraz zauważyłem brak powiązania pomiędzy tabelami, a miałem to zrobić na samym początku. Ok, teraz tabela comments wygląda tak:

  1. CREATE TABLE comments (
  2. id int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  3. obj_id int UNSIGNED NOT NULL,
  4. username char(50) NOT NULL,
  5. mail char(50),
  6. type tinyint UNSIGNED NOT NULL,
  7. contents text NOT NULL,
  8. datetime char(16) NOT NULL
  9. );


Aczkolwiek nie wiem, jak wykonać owe łączenie... sad.gif Daj proszę jakiś przykład użycia count z łączeniem tabel

Pozdrawiam
Cienki1980
Strzelam z palca i bez możliwości sprawdzenia:
  1. SELECT n.* count(c.id) AS cnt FROM news n
  2. INNER JOIN comments c ON n.id=c.obj_id ORDER BY n.id DESC
mokry
W tabeli comment dodaj kolumnę news_id i przy każdym komentarzu do tego pola daj id newsa a potem już tylko:

  1. SELECT news.*, (SELECT COUNT(comments.id) FROM comments WHERE news.id = comments.obj_id) AS ile_komentarzy
  2. FROM news ORDER BY news.id DESC
KCG
Ewentualnie możesz zrobić kolumnę 'comments' w tabeli z newsami i tam przechowywać liczbę komentarzy smile.gif (powiększaj przy dodawaniu komentarza)
l0ud
Wielkie dzięki za chęci, niestety, żadne zapytanie nie chce działać sad.gif

@Cienki1980
Kod
Blad krytyczny: Nie udalo sie wykonac zapytania: select n.*, count(c.id) as cnt from news n inner join comments c on n.id=c.obj_id order by n.id desc

Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause


@mokry, a MySQL obsługuje w ogóle zapytanie w zapytaniu? [wersja 3.23.58]
Kod
Blad krytyczny: Nie udalo sie wykonac zapytania: SELECT news.*, (SELECT COUNT(comments.id) FROM comments WHERE news.id = comments.obj_id) AS ile_komentarzy FROM news ORDER BY news.id DESC

Something is wrong in your syntax obok 'SELECT COUNT(comments.id) FROM comments WHERE news.id = comments' w linii 1


Wkleiłem to co mi wyrzucił sterownik bazy, bo jednocześnie widać zapytanie i błąd.

KCG, myślałem nad tym, ale wydawało mi się to niepotrzebnym utrudnieniem (zwłaszcza w PA). Już równie dobrze mógłbym wywoływać oddzielne zapytanie dla każdego newsa, (pobierające ilość komentarzy) ale wolałbym tego uniknąć...
Cienki1980
Pisałem z palca i nie miałem gdzie sprawdzić. Bardziej chciałem pokazać jak wykorzystać joina a nie 100% poprawne rozwiązanie.
Co do GROUP to musisz dodać grupowanie po odpowiednich kolumnach na końcu zapytania i zapytanie powinno ruszyć.
Wieviór
Cytat(l0ud @ 15.03.2008, 00:54:51 ) *
KCG, myślałem nad tym, ale wydawało mi się to niepotrzebnym utrudnieniem (zwłaszcza w PA). Już równie dobrze mógłbym wywoływać oddzielne zapytanie dla każdego newsa, (pobierające ilość komentarzy) ale wolałbym tego uniknąć...


To jest jednak dobre rozwiązanie. Szczególnie jeśli komentarzy masz dużo. Pomyśl, że skrypt będzie przy każdym wyświetlanym newsie zliczał powiedzmy 10 komentarzy z tabeli, w której będzie jej 10 000 ;]... po prostu przy dodawaniu komentarza dopisuj 1, przy usuwaniu odejmuj 1 i tyle. Możesz nawet pokusić się o triggery ;]
l0ud
@Wieviór, ale to ma być bardzo mała stronka i tak szczerze nie spodziewam się więcej niż kilkudziesięciu komentarzy do kilkunastu newsów smile.gif

Obecnie mam zapytanie wyglądające tak:
  1. SELECT n.*, count(c.id) AS cnt FROM news n INNER JOIN comments c ON c.obj_id=n.id GROUP BY n.id ORDER BY n.id DESC


Nie generuje ono już żadnych błędów, ale nie działa sad.gif Nie zwracają się żadne rekordy, chociaż w tabeli news znajduje się jedna pozycja.
Pewnie nie jest to jakiś poważny błąd, niestety nie do przejścia przeze mnie, więc ponownie proszę o pomoc...
Cienki1980
Cytat(l0ud @ 15.03.2008, 10:50:42 ) *
@Wieviór, ale to ma być bardzo mała stronka i tak szczerze nie spodziewam się więcej niż kilkudziesięciu komentarzy do kilkunastu newsów smile.gif

Obecnie mam zapytanie wyglądające tak:
  1. SELECT n.*, count(c.id) AS cnt FROM news n INNER JOIN comments c ON c.obj_id=n.id GROUP BY n.id ORDER BY n.id DESC


Nie generuje ono już żadnych błędów, ale nie działa sad.gif Nie zwracają się żadne rekordy, chociaż w tabeli news znajduje się jedna pozycja.
Pewnie nie jest to jakiś poważny błąd, niestety nie do przejścia przeze mnie, więc ponownie proszę o pomoc...


Jeżeli w tabeli comments nie ma żadnego wpisu nie pokaże się żaden wpis ... dzieje się tak bo wykorzystałeś INNER JOIN.
Zastąp INNER JOIN tekstem LEFT JOIN i powinno coś się pokazać.
PS. Żeby dowiedzieć się czym się różni INNER od LEFT zapraszam do manuala biggrin.gif
l0ud
Dzięki wielkie, wygląda na to, że w końcu zaczęło działać biggrin.gif
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.