mboost-dp1

blog - optælle antal kommentarer i indlæg


Gå til bund
Gravatar #1 - simonduun
10. okt. 2011 14:04
Jeg er ved at lave min egen blog. Er stødt ind i det "problem" at jeg skal have talt hvor mange kommentarer der er postet til hvert blogindlæg.

Eksempel

Den sql kode jeg bruger når brugeren har valgt et blogindlæg er:
SELECT a.*,c.*, COUNT(c.comment_id) AS commentsCount
FROM content AS a
JOIN comments AS c ON (a.content_id = c.comment_contentid)
WHERE content_shorturl ='". $shorturl ."'";


Men hvordan skriver jeg den kode om så den kan køre alle indlæg igennem, og tælle ud fra hvert indlæg som vist på eksemplet hvor mange kommentarer der er oprettet?

Spørg hvis jeg skriver russisk ;)
Gravatar #2 - izym
10. okt. 2011 14:08
Jeg bruger ikke SQL meget i hverdagen, men jeg vil gætte på, at det skal være noget i stil med:
SELECT a.*, COUNT(c.comment_id) AS commentsCount
FROM content AS a
JOIN comments AS c ON (a.content_id = c.comment_contentid);
Gravatar #3 - simonduun
10. okt. 2011 14:50
izym (2) skrev:
Jeg bruger ikke SQL meget i hverdagen, men jeg vil gætte på, at det skal være noget i stil med:
SELECT a.*, COUNT(c.comment_id) AS commentsCount
FROM content AS a
JOIN comments AS c ON (a.content_id = c.comment_contentid);


Hmm... Hvis jeg bruger dit forslag henter den kun 1 blogindlæg ud, og den tæller forkert under commentsCount. :/ Bruger selvfølgelig en while i min php kode når jeg trækker data ud.
Gravatar #4 - D_V
10. okt. 2011 15:10
Du skal bruge noget i stil med denne:

SELECT a.*, COUNT(c.comment_id) AS commentsCount
FROM content AS a
LEFT JOIN comments AS c ON (a.content_id = c.comment_contentid)
GROUP BY a.content_id


Nu kender jeg ikke dit table layout, men du skal ændre GROUP BY syntaxen, til det felt som er unikt for hver blog indlæg.

Kunne så udlede ovenstående ved lige at læse ordentligt, har også fjernet at den selecter c.*, da det ikke giver nogen mening.

EDIT: ovenstående er lavet udfra den antagelse at du bruger MySQL
Gravatar #5 - simonduun
10. okt. 2011 15:16
D_V (4) skrev:
Du skal bruge noget i stil med denne:

SELECT a.*, COUNT(c.comment_id) AS commentsCount
FROM content AS a
LEFT JOIN comments AS c ON (a.content_id = c.comment_contentid)
GROUP BY a.content_id


Nu kender jeg ikke dit table layout, men du skal ændre GROUP BY syntaxen, til det felt som er unikt for hver blog indlæg.

Kunne så udlede ovenstående ved lige at læse ordentligt, har også fjernet at den selecter c.*, da det ikke giver nogen mening.

EDIT: ovenstående er lavet udfra den antagelse at du bruger MySQL


Tak - Det virker helt fint indtilvidere :)
Gravatar #6 - simonduun
10. okt. 2011 15:50
Ehm... Lige et til problem jeg opdagede. Hvordan sørger jeg for at den stadig kan hente informationer ud hvis brugeren har klikket på et blogindlæg hvor der ikke er skrevet en kommentar til? Den sql sætning jeg bruger til det er:

SELECT a.*,c.*, COUNT(c.comment_id) AS commentsCount
FROM content AS a
JOIN comments AS c ON (a.content_id = c.comment_contentid)
WHERE content_shorturl ='". $shorturl ."'"
Gravatar #7 - simonduun
10. okt. 2011 15:51
soduno (6) skrev:
Ehm... Lige et til problem jeg opdagede. Hvordan sørger jeg for at den stadig kan hente informationer ud hvis brugeren har klikket på et blogindlæg hvor der ikke er skrevet en kommentar til? Den sql sætning jeg bruger til det er:

SELECT a.*,c.*, COUNT(c.comment_id) AS commentsCount
FROM content AS a
JOIN comments AS c ON (a.content_id = c.comment_contentid)
WHERE content_shorturl ='". $shorturl ."'"


Fik det til at virke ved at benytte LEFT JOIN i stedet for Join. Er det forkert? :)
Gravatar #8 - D_V
10. okt. 2011 17:44
#7

Nej det er det ikke.

En JOIN kræver at begge sidder eksistere, hvor en LEFT JOIN kræver venstre side eksistere, og vice-versa for RIGHT JOIN..

LEFT/RIGHT defineres som at den tabel du joiner er på højre side af join.


Det har den effekt at når du bruger LEFT JOIN, så må resultatet af joinet gerne være NULL.

EDIT: det blev godt nok lidt snørklet at læse, håber det kan bruges.
Gravatar #9 - simonduun
10. okt. 2011 18:19
D_V (8) skrev:
#7
Nej det er det ikke.
En JOIN kræver at begge sidder eksistere, hvor en LEFT JOIN kræver venstre side eksistere, og vice-versa for RIGHT JOIN..
LEFT/RIGHT defineres som at den tabel du joiner er på højre side af join.
Det har den effekt at når du bruger LEFT JOIN, så må resultatet af joinet gerne være NULL.
EDIT: det blev godt nok lidt snørklet at læse, håber det kan bruges.


Okay - tak for det, så forstår jeg det meget bedre :)
Gravatar #10 - apkat
10. okt. 2011 18:38
Gravatar #11 - simonduun
10. okt. 2011 18:42
#Yes :)
Gravatar #12 - D_V
10. okt. 2011 20:37
apkat (10) skrev:
Connection?


Hvad er det dog for en opførsel, at sidde og rate soduno som flamebait på hans fuldstændige relevante indlæg.

Og hvad så hvis ham gutten på eksperten ikke fattede spørgsmålet, så vidt jeg kan se er det formuleret på præcis samme måde.
Gravatar #13 - simonduun
11. okt. 2011 20:20
Hmm... Er stødt ind i et andet problem siden sidst.
Skal kun have talt de kommentarer der har fået en accept. Dette gøres ved at give en række som hedder comment_accepted værdi 1. Tabellen som comment_accepted ligger i hedder comments.

Har prøvet følgende uden held:

SELECT a.*,c.*, COUNT(c.comment_id) AS commentsCount
FROM content AS a, comments AS c
WHERE a.content_id = c.comment_contentid
AND content_shorturl='". $_GET['url'] ."'
AND c.comment_accepted = 1
Gravatar #14 - D_V
11. okt. 2011 21:31
Den simple løsning på den, er hvis du kun bruger 0 og 1 i `comment_accepted`
Så ændre du bare COUNT(c.comment_id) til SUM(c.comment_accepted)

Det kan dog diskuteres om det er den korrekte måde at gøre det på, hvis ovenstående ikke kan bruges må du lige sige til, så finder jeg nogen andre eksempler frem.


Btw... på ovenstående har jeg meget svært ved at se brugbarheden af at selecte comments.*

Er der en dybere tankegang bagved det ?
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login