Avatar billede raos Nybegynder
18. oktober 2002 - 21:51 Der er 13 kommentarer og
1 løsning

SQL hjælp

Jeg har lavet et debat forum og ønsker, ud for hver tråd at vise hvor mange indlæg der har været siden en given dato.I dag gør jeg det ved først at selecte rod-indlægene - og hvor hver af dem lave et select statement der summere op hvor mange svar der har været. Men det går lidt for langsomt. Så jeg spekulerer på om man kunne lave det i 1 eller 2 select statements.

Her er lidt psudo code for hvordan jeg gør idag:

rs = "select * from spørgsmål"
while not rs.eof
    rsCount = "select  count(*) AS nr from svar where debat_svar_dato > CONVERT(datetime, '19/08/2002 21:51:26', 105) AND spørgsmålsid = 1638"
   
    response.write "der er " & rsCount("nr").value & " svar i denne tråd"

wend
Avatar billede erikjacobsen Ekspert
18. oktober 2002 - 22:07 #1
rsCount = "select  spørgsmålsid,count(*) AS nr from svar where debat_svar_dato > CONVERT(datetime, '19/08/2002 21:51:26', 105) group by spørgsmålsid"
Avatar billede kfrede Nybegynder
18. oktober 2002 - 22:09 #2
mysql> select count(*), spørgsmålsid from spørgsmål where... group by spørgsmål;
+----------+----------------+
| count(*) | spørgsmålsid  |
+----------+----------------+
|        2 | 1000          |
|        1 | 1001          |
|        2 | 1002          |
|        1 | 1003          |
+----------+----------------+
4 rows in set (0.02 sec)
Avatar billede raos Nybegynder
18. oktober 2002 - 22:17 #3
arrgggg - jeg glemmer altid "group by"

Mange tak for jeres hjælp. Men hvem giver jeg nu point til?
Avatar billede kfrede Nybegynder
18. oktober 2002 - 22:22 #4
gi dem til erik han kom først og jeg havde en lille syntaks fejl :-)
Avatar billede erikjacobsen Ekspert
18. oktober 2002 - 22:51 #5
Jeg gider ikke samle på ligegyldige point
Avatar billede raos Nybegynder
18. oktober 2002 - 22:52 #6
øhhh ?
Avatar billede bennytordrup Nybegynder
19. oktober 2002 - 09:56 #7
Prøv denne:

select spørgsmålid, count(*) as nr from svar where debat_svar_dato > '20020819 21:51:26:000' group by sporgsmålid

Du undgår en convert i din where, hvilket kan få SQL Server til at undgå at bruge indeks på debat_svar_dato kolonnen.
Avatar billede bennytordrup Nybegynder
19. oktober 2002 - 09:59 #8
For at fortsætte med kommentarer, så er det en dårlig ide at bruge count(*). Ud fra select statementet går jeg ud fra, at du også har et svarid på svar-tabellen, så det vil være bedre at lave denne:

select spørgsmålid, count(svarid) as nr from svar where debat_svar_dato > '20020819 21:51:26:000' group by spørgsmålid

Og når vi er herovre, så vil det bedste indeks, du kan lave på tabellen i den her forbindelse (hvis det er en forespørgsel, der bruges meget) være et indeks på felterne spørgsmålid, svarid, debat_svar_dato.

Det giver dig et indeks, der dækker alle felter i forespørgslen (covering index), hvilket betyder, at SQL Server kan give dig svaret uden overhovedet at komme ned i de egentlige data, da alle nødvendige data ligger i indeks.
Avatar billede bennytordrup Nybegynder
19. oktober 2002 - 10:01 #9
Ydermere: I din pseudo-kode laver du en select *. Dette er IMO en dødssynd at gøre mod en SQL Server. Du skal ALDRIG bede om flere data, end du har brug for. Har du brug for to bestemte felter, selecter du disse bestemte to felter.
Avatar billede bennytordrup Nybegynder
19. oktober 2002 - 10:02 #10
Omkring evt. pointfordeling: Læg et svar selv, og fordel med størstedelen af pointene til dig selv. IMO er spørgsmålet ikke mere end 20-30 points værd.
Avatar billede kfrede Nybegynder
19. oktober 2002 - 11:39 #11
COUNT(*) is optimised to return very quickly if the SELECT retrieves from one table, no other columns are retrieved, and there is no WHERE clause.  For example:


mysql> SELECT COUNT(*) FROM student;



MySQL Reference Manual (C) 2002 MySQL AB
Avatar billede bennytordrup Nybegynder
19. oktober 2002 - 13:57 #12
kfrede> Hvorfor refererer du MySQL, når vi snakker Microsoft SQL Server?
Avatar billede kfrede Nybegynder
19. oktober 2002 - 14:24 #13
Det er ikke fordi jeg er uenig med dig ! Men man skal bare være opmærksom på, at count(*) kan være optimeret for visse selects, hvorfor det ikke altid er en dårlig idé at bruge count(*). MySQL er tilfældigvis bare den database jeg bruger, jeg kender ikke til detaljerne for MS SQL, men mon ikke der her også foregår noget optimering.
Avatar billede bennytordrup Nybegynder
19. oktober 2002 - 15:37 #14
Jeg prøvede lige lidt af i MS Query Analyzer.

MS SQL Server ændrer faktisk en Count(Primærfelt) til Count(*) i execution plan.
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