Avatar billede sjh Nybegynder
19. februar 2007 - 16:47 Der er 8 kommentarer og
1 løsning

Join count på tabler

Jeg har disse tabler og vil godt ha noget JOIN COUNT.. kan man det?


Her vil jeg godt have en COUNT på som viser hvormange spørgsmål der er fra "forumq (kid) "
  sql = "SELECT id, title, text FROM forumk ORDER BY orderby;"
  resultat : id | title | text | counts


Her vil jeg også godt have en COUNT på som viser hvormange kommentar der er fra "forumc (qid) "
  sql = "SELECT id, dato, title, username FROM forumq WHERE kid='(kid)';"
  resultat : id | dato | title | username | counts


CREATE TABLE `forumc` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `qid` int(11) NOT NULL default '0',
  `dato` int(11) NOT NULL default '0',
  `username` varchar(15) NOT NULL default '',
  `text` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Forum kommentar';


CREATE TABLE `forumk` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `title` varchar(255) NOT NULL default '',
  `text` text NOT NULL,
  `orderby` int(1) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Forum Kategori';


CREATE TABLE `forumq` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `kid` int(11) NOT NULL default '0',
  `dato` int(11) NOT NULL default '0',
  `username` varchar(15) NOT NULL default '',
  `locked` int(1) NOT NULL default '0',
  `title` varchar(255) NOT NULL default '',
  `text` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Forum spørgsmål';
Avatar billede sjh Nybegynder
19. februar 2007 - 22:19 #1
Når har fået dem til at virke.. dog ikke med JOIN :D det var åbenbart ikke sådan jeg kunne få det til at virke.. hvis der er nogle som har et bedre forslag så kom bare med det..

Her er mit :

SELECT
forumk.id,
forumk.title,
forumk.text,
(SELECT COUNT(kid) FROM forumq WHERE forumq.kid = forumk.id) AS counts
FROM forumk


SELECT
forumq.id,
forumq.dato,
forumq.title,
forumq.username,
(SELECT COUNT(qid) FROM forumc WHERE forumc.qid = forumq.id) AS counts
FROM forumq WHERE kid='1'
Avatar billede kjulius Novice
19. februar 2007 - 22:52 #2
Hmmm... Normalt er det ikke særligt effektivt at lave det som en subselect, og jeg ser ærlig talt heller ingen grund til at gøre det på den måde (hvis jeg ellers tolker din query korrekt), da det synes "straight-forward". Mit forslag ville i stedet være:

SELECT k.id, k.title, k.text, COUNT(q.kid) AS counts
FROM forumk k
INNER JOIN forumq q ON k.id = q.kid
GROUP BY k.id, k.title, k.text

og

SELECT q.id, q.dato, q.title, q.username, COUNT(c.qid)
FROM forumq q
INNER JOIN forumc c ON q.id = c.qid
WHERE q.kid = '1'
GROUP BY q.id, qdato, q.title, q.username
Avatar billede kjulius Novice
19. februar 2007 - 22:55 #3
NB. Afhængigt af om omstændighederne vil en LEFT JOIN måske være et bedre valg end en INNER JOIN...
Avatar billede sjh Nybegynder
19. februar 2007 - 23:58 #4
øhh.. den udskriver kun dem hvor counts er større end 0 ?? den skal udskrive dem alle også selv om count er 0

har tested det med den første (SELECT k.id, k.title, k.text, COUNT(q.kid) AS counts....)
Avatar billede kjulius Novice
20. februar 2007 - 00:12 #5
Okay, så skal du udskifte INNER JOIN med LEFT JOIN, som jeg skrev som en eftertanke i min NB.
Det burde gi' dig alle...
Avatar billede sjh Nybegynder
20. februar 2007 - 00:26 #6
ja så langt kom jeg ikke :D

men det virker også fint nu med left join.. er din sql beder en den jeg fik bixed sammen..?? tænker mest på hastighed ??
Avatar billede kjulius Novice
20. februar 2007 - 01:17 #7
Ja, det vil jeg mene. Når du laver det som en subselect risikerer du, at subselecten bliver udført for hver eneste række i din hovedselect. Det kan blive til mange gange den subselect bliver udført hvis du har mange rækker. Når jeg siger risikerer, så er det fordi de kommer an på MySQL's intelligens. Måske kan den gennemskue situatinen og automatisk "oversætte" det til en forespørgsel som min, men jeg tvivler... :-)

Siden du spørger, går jeg ud fra, at du tester på et begrænset antal rækker. Så snart du overskrider et par hundrede rækker, burde du kunne begynde at ane en forskel i hastighed...
Avatar billede kjulius Novice
20. februar 2007 - 01:21 #8
Lille stavefejl: "gennemskue situatinen" skulle naturligvis have været "gennemskue situationen" :-)
Avatar billede sjh Nybegynder
20. februar 2007 - 05:13 #9
ok, tror dog ikke jeg kommer over 100 kategorier :D men derfor kan man jo godt tage den løsning som har den bedste hastighed ;)

Jeg vil sige mange tak for hjælpen.
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