Avatar billede mrfunder Nybegynder
12. august 2008 - 17:48 Der er 14 kommentarer og
1 løsning

Hjælp til query count

Hej Eksperter.

Jeg prøver i øjeblikket at optimere mine queries, idet har jeg gjort mig et forsøg med:

$forum_count_threads = mysql_query("SELECT COUNT(forumthreads.id), COUNT(forumcomments.id) FROM forumthreads, forumcomments WHERE category='".$row_forum_categories['id']."'");
                            $forum_count_threads1 = mysql_fetch_array($forum_count_threads);

echo $forum_count_threads1['COUNT(forumthreads.id)'];

echo $forum_count_threads1['COUNT(forumcomments.id)'];

Hvilket giver nogle langt højere tal end hvis jeg brugte to queries på hvert id og så blot en echo mysql_num_rows.

Hvad gør jeg galt?

På forhånd tak :)
Avatar billede arne_v Ekspert
12. august 2008 - 18:25 #1
Jeg tror at du mangler en JOIN betingelse paa de 2 tabeller !
Avatar billede mrfunder Nybegynder
12. august 2008 - 19:05 #2
Hej Arne.

Jeg er relativ ny i faget join, faktisk er jeg en grønskolding.

Kan du forklare mig hvordan det laves, og hvorfor der skal bruges JOIN?

På forhånd tak
Avatar billede arne_v Ekspert
12. august 2008 - 19:07 #3
$forum_count_threads = mysql_query("SELECT COUNT(forumthreads.id), COUNT(forumcomments.id) FROM forumthreads, forumcomments WHERE forumthreads.x = forumcomments.y category='".$row_forum_categories['id']."'");

jeg ved ikke hvad x og y er.
Avatar billede arne_v Ekspert
12. august 2008 - 19:08 #4
Hvis du selecter fra 2 tabeller uden at angive hvad der skal joines paa
saa kombinerer SQL alle raekker fra den ene med alle raekker fra den anden.

Hvis der er 100 raekker i begge tabeller, saa faar du 10000 raekker i output.
Avatar billede mrfunder Nybegynder
12. august 2008 - 19:28 #5
Jeg er ikke sikker på jeg forstår hvad du mener med:

WHERE forumthreads.x = forumcomments.y category='".$row_forum_categories['id']."'");

Jeg har nu umiddelbart prøvet med:

$forum_count_threads = mysql_query("SELECT COUNT(forumthreads.id), COUNT(forumcomments.id) FROM forumthreads LEFT JOIN forumcomments ON forumthreads.category = forumcomments.category_id WHERE category='".$row_forum_categories['id']."'");

men den returnere også forkerte resultater..

Er det bedst blot at lave mine to counts i to forskellige queries idet der er fra forskellige tabeller?
Avatar billede arne_v Ekspert
12. august 2008 - 19:58 #6
Nej.

Hvad tilknytter en forumcomment til en forumthread ?

Jeg tror ikke at det er category.

Formentligt har forumthread et id felt og forumcomment et thread_id felt der peger
paa den rigtige thread.

De er x og y.
Avatar billede mrfunder Nybegynder
12. august 2008 - 20:02 #7
forumthread har (id)
forumcomments har (thread_id)

- disse to er mine relationer
Avatar billede arne_v Ekspert
12. august 2008 - 20:11 #8
saa

... WHERE forumthreads.id = forumcomments.thread_id AND category= ....
Avatar billede mrfunder Nybegynder
12. august 2008 - 22:23 #9
Beklager ventetiden, og mange tak for din tålmodighed med mig :)

Jeg har fået fremstykket mig frem til flg.
$forum_count_threads = mysql_query("SELECT COUNT(forumthreads.id) AS total_threads, COUNT(forumcomments.thread_id) AS total_comments FROM forumthreads, forumcomments WHERE forumthreads.id = forumcomments.thread_id AND forumthreads.category='".$row_forum_categories['id']."'");

Jeg synes jeg har prøvet alle tænklige kombinationer, men den returnere stadig ikke korrekte tal.

total_comments returneres korrekt, desværre returnere den samme værdi som total_comments har i total_threads-

Jeg er virkelig blank
Avatar billede arne_v Ekspert
12. august 2008 - 22:29 #10
Ah. Ja - der er altid lige mange raekker i alle kolonner i query output.

Men der er et lile trick !

$forum_count_threads = mysql_query("SELECT COUNT(forumthreads.id) AS total_threads, COUNT(DISTINCT forumcomments.thread_id) AS total_comments FROM forumthreads, forumcomments WHERE forumthreads.id = forumcomments.thread_id AND forumthreads.category='".$row_forum_categories['id']."'");
Avatar billede arne_v Ekspert
12. august 2008 - 22:30 #11
Ooops.

DISTINCT sat ind forkert sted.

$forum_count_threads = mysql_query("SELECT COUNT(DISTINCT forumthreads.id) AS total_threads, COUNT(forumcomments.thread_id) AS total_comments FROM forumthreads, forumcomments WHERE forumthreads.id = forumcomments.thread_id AND forumthreads.category='".$row_forum_categories['id']."'");
Avatar billede arne_v Ekspert
12. august 2008 - 22:31 #12
og foelgende vil nok vaere mere beskrivende:

$forum_count_threads = mysql_query("SELECT COUNT(DISTINCT forumthreads.id) AS total_threads, COUNT(forumcomments.id) AS total_comments FROM forumthreads, forumcomments WHERE forumthreads.id = forumcomments.thread_id AND forumthreads.category='".$row_forum_categories['id']."'");
Avatar billede mrfunder Nybegynder
12. august 2008 - 22:42 #13
Nu returnere den godt nok to forskellige værdier som den burde- dog matcher total_comments det rigtige resultatet, men stadig ikke total_threads.
Avatar billede mrfunder Nybegynder
12. august 2008 - 22:54 #14
$forum_count_threads = mysql_query("SELECT COUNT(DISTINCT forumthreads.id) AS total_threads, COUNT(forumcomments.thread_id) AS total_comments FROM forumthreads LEFT JOIN forumcomments ON forumthreads.id = forumcomments.thread_id WHERE forumthreads.category='".$row_forum_categories['id']."'");


- Did the trick :)

Jeg vil takke af for i aften, mange tak for hjælpen- det har været kanon.

Smid venligst et svar
Avatar billede arne_v Ekspert
12. august 2008 - 23:09 #15
OK
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester