Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Zliczanie komentarzy przy pobieraniu newsa
l0ud
post 14.03.2008, 20:33:49
Post #1





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

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


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


--------------------
XMPP: l0ud@chrome.pl
Go to the top of the page
+Quote Post
Cienki1980
post 14.03.2008, 20:42:40
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


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.


--------------------
404
Go to the top of the page
+Quote Post
l0ud
post 14.03.2008, 20:58:15
Post #3





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

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


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


--------------------
XMPP: l0ud@chrome.pl
Go to the top of the page
+Quote Post
Cienki1980
post 14.03.2008, 21:02:48
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


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


--------------------
404
Go to the top of the page
+Quote Post
mokry
post 14.03.2008, 21:12:06
Post #5





Grupa: Zarejestrowani
Postów: 374
Pomógł: 23
Dołączył: 3.06.2006
Skąd: Katowice

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


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


Ten post edytował mokry 14.03.2008, 21:20:26


--------------------
Pomogłem? Podziękuj proszę klikając poniżej "POMÓGŁ" ;)
Go to the top of the page
+Quote Post
KCG
post 14.03.2008, 22:11:53
Post #6





Grupa: Zarejestrowani
Postów: 449
Pomógł: 4
Dołączył: 1.12.2006

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


Ewentualnie możesz zrobić kolumnę 'comments' w tabeli z newsami i tam przechowywać liczbę komentarzy smile.gif (powiększaj przy dodawaniu komentarza)

Ten post edytował KCG 14.03.2008, 22:12:37


--------------------
9242594 - zaczynasz? jak mogę, to pomogę :D /podstawowa znajomość php :P /
"to pomoc zawsze będzie gestem pięknym, zaliczana do tych teraz rzadko spotykanych..."
Go to the top of the page
+Quote Post
l0ud
post 14.03.2008, 22:54:51
Post #7





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

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


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ąć...


--------------------
XMPP: l0ud@chrome.pl
Go to the top of the page
+Quote Post
Cienki1980
post 15.03.2008, 09:04:27
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


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


--------------------
404
Go to the top of the page
+Quote Post
-Wieviór-
post 15.03.2008, 09:15:32
Post #9





Goście







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 ;]
Go to the top of the page
+Quote Post
l0ud
post 15.03.2008, 10:50:42
Post #10





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

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


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


--------------------
XMPP: l0ud@chrome.pl
Go to the top of the page
+Quote Post
Cienki1980
post 15.03.2008, 10:54:10
Post #11





Grupa: Przyjaciele php.pl
Postów: 1 590
Pomógł: 40
Dołączył: 11.01.2007
Skąd: Centrum

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


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


--------------------
404
Go to the top of the page
+Quote Post
l0ud
post 15.03.2008, 10:59:09
Post #12





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

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


Dzięki wielkie, wygląda na to, że w końcu zaczęło działać biggrin.gif


--------------------
XMPP: l0ud@chrome.pl
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: 29.06.2025 - 08:06