Avatar billede bingokaj Nybegynder
02. februar 2006 - 12:02 Der er 11 kommentarer og
1 løsning

Hvordan kombinerer man disse to sql-sætninger?

Howdy.

Jeg har noget asp-kode som via sql spytter en liste ud over brugere i min db. Hver bruger skal dernæst tjekkes for om han/hun har præcis 12 poster i en anden table. Mit problem er at jeg i øjeblikket bliver nødt til at anvende 2 sql-sætninger for at generere listen, hvilket giver et voldsomt performance-tab.

Her er de sql-sætninger jeg bruger:

Sætning_1:
SELECT users.ID, users.navn, users.alder, users.amt FROM users
ORDER BY users.ID DESC

Sætning_2:
SELECT COUNT(*) AS supertotal FROM works, votes WHERE votes.vote_id = 11 AND votes.titel_id = works.ID AND works.kategori = 1

Sætning_1 bruger jeg til at hente listen over brugere og Sætning_2 kører jeg (via asp) for hver enkelt bruger i min db. Problemet er at Sætning_2 tager ca. 0.2 sekunder at udføre og da jeg tit skal liste op mod 100+ brugere, så er min loadetid oppe omkring 30-40 sekunder.

Mit spørgsmål er derfor om det er muligt at kombinere de 2 sql-sætninger på en smart måde? Er der nogle andre ting jeg kan gøre for at øge hastigheden i Sætning_2?
Avatar billede aaberg Nybegynder
02. februar 2006 - 13:59 #1
SELECT users.ID, users.navn, users.alder, users.amt
FROM users, works, votes
WHERE votes.vote_id ? 11
AND votes.titel_id = works.ID
AND works.kategori = 1
AND works.user_id = user.ID
GROUP BY users.ID, users.navn, users.alder, users.amt
HAVING COUNT(works.ID = 12)

Denne query skulle gerne finde alle users, som har 12 poster i works joinet med votes. Fidusen er at bruge HAVING sammen med GROUP BY.
Avatar billede aaberg Nybegynder
02. februar 2006 - 14:00 #2
En lille rettelse. Der kom et "?" tegn ind midt i det hele. Dette skal selvfølgelig være et "=" tegn.

SELECT users.ID, users.navn, users.alder, users.amt
FROM users, works, votes
WHERE votes.vote_id = 11
AND votes.titel_id = works.ID
AND works.kategori = 1
AND works.user_id = user.ID
GROUP BY users.ID, users.navn, users.alder, users.amt
HAVING COUNT(works.ID = 12)
Avatar billede bingokaj Nybegynder
02. februar 2006 - 20:27 #3
Jeg kan ikke få det til at virke umiddelbart.

1. Jeg får en fejl i den sidste linje "HAVING COUNT(works.ID = 12)".
2. Jeg undrer mig lidt over linjen "AND works.user_id = user.ID". Er det meningen at den skal være med ? (jeg har hverken et works.user_id eller et user.ID - jeg har dog et users.ID...?)
Avatar billede aaberg Nybegynder
03. februar 2006 - 19:35 #4
Det er ikke sikkert at den query jeg skrev er helt rigtig, jeg kender jo ikke dine tabeller. Grunden til at jeg skrev AND works.user_id = user.ID, er for at joine works tabellen og user tabellen. Hvis denne join ikke er korrekt, skal dette selvfølgelig rettes.

Hvordan lyder den fejl du har fået?
Avatar billede bingokaj Nybegynder
04. februar 2006 - 00:38 #5
ja, ok - nu har jeg tilrettet sætningen til det her:

SELECT users.ID, users.navn, users.alder, users.amt
FROM users, works, votes
WHERE votes.titel_id = works.ID
AND works.kategori = 1
AND votes.vote_id = users.ID
GROUP BY users.ID, users.navn, users.alder, users.amt
HAVING COUNT(works.ID = 12)

Nu er det eneste problem fejlmeldingen i sidste linje. Fejlmeddelelsen fra SQL Manager er "Line 7: Incorrect syntax near '='."
Avatar billede aaberg Nybegynder
04. februar 2006 - 16:28 #6
prøv: HAVING COUNT(works.ID) = 12

Jeg tror jeg har lavet en skrivefejl i mit eksempel.
Avatar billede bingokaj Nybegynder
06. februar 2006 - 14:31 #7
Hej aaberg

Du er übercool :-D Det virker PERFEKT.
Smid et svar, så får du en stak velfortjente point.
Avatar billede aaberg Nybegynder
06. februar 2006 - 16:37 #8
Tusind tak for komplimenten. Jeg går ud fra at din performance er blevet en del bedre (Især når du har mange users) :-)
Avatar billede bingokaj Nybegynder
07. februar 2006 - 00:23 #9
Jep, også i den grad. Du kan tjekke din hastighedsforbedring på: http://www.dr.dk/kanon/minKanon/filmBrugerne.asp. Den var tidligere 40-50 sekunder om at loade...
Avatar billede bingokaj Nybegynder
07. februar 2006 - 00:23 #10
Jep, også i den grad. Du kan tjekke din hastighedsforbedring på: http://www.dr.dk/kanon/minKanon/filmBrugerne.asp. Den var tidligere 40-50 sekunder om at loade...
Avatar billede aaberg Nybegynder
07. februar 2006 - 09:17 #11
Ikke dårligt. Jeg tror det tog 2 sekunder fra jeg trykkede på linket, til hele siden var loadet. Jeg går ud fra at det var alle 150 point værd! :-)
Avatar billede bingokaj Nybegynder
07. februar 2006 - 12:13 #12
ja, det var lidt svært at forklare overfor DR at en liste over kun 100 brugere fik brugeren til at tro at hans computer var gået ned ;-)
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