19. februar 2007 - 16:47Der 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';
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'
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
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...
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.
Synes godt om
Ny brugerNybegynder
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.