webForumDet fria alternativet

Prestandajakt

ASP

8 svar · 330 visningar · startad av joakimweb

Medlem sedan feb. 2002141 inlägg
Frågan#1
Medlem sedan juni 20019 024 inlägg
#2

Det räcker med en sql-sats:

SELECT SUM(antal) FROM dag WHERE tillid=X ORDER BY id DESC limit 7

Funktionen sum() adderar värden, kort och gott.

Medlem sedan feb. 2002141 inlägg
#3

Mjo, men exakt så har jag ju :-(

IntTotal = Connect.Execute("SELECT Sum(antal) FROM dag WHERE tillid='"&iID&"' ORDER BY id DESC limit 7").Fields(0)

fast att jag då skippar RecSetet. Finns det inget annat sätt att skriva med sum just när man ska ha limit med?

Medlem sedan juni 20004 308 inlägg
#4

Tråden flyttas (kanske borde flyttas till SQL).

Medlem sedan dec. 200012 464 inlägg
#5

Det man vill göra är

SELECT Sum(antal) FROM (
select antal 
from dag 
WHERE tillid= <iID> 
ORDER BY id DESC 
limit 7) dt

-- eller

select sum(antal) from dag
where tillid = <iID>
and id in (
    select id 
      from dag 
     order by id desc 
     limit 7)

Eftersom det ser ut som Mysql så går inte det och då får man göra det i flera steg. Skapa en temptabell som innehåller värdena från

select antal
      from dag 
     order by id desc 
     limit 7

och gör sedan summeringen på värdena i temptabellen.

Medlem sedan feb. 2002141 inlägg
#6

Okej, bra att veta =)
MySQL-databas används.

Om man har som nu att 7 senaste loopas igenom och då antal = antal + RecSet("antal"), tjänar man nåt på att skapa en temporär tabell med innehållet, räkna ut och sedan radera?

Jag har inte arbetat så mycket med såpass avancerad SQL, har du något exempel på hur en temp-tabell skall göras? (tabelltyp + transfer av 7 senaste till egen tabell)

Tack på förhand!

Medlem sedan dec. 200012 464 inlägg
#7

Om det bara gäller 7 värden så kan du lika gärna hämta värdena till applikationen och summera där så just i detta fall har man inte någon direkt nytta av en temptabell.

Man kan skapa en temptabell med

create temporary table x select ....

http://www.mysql.com/doc/en/CREATE_TABLE.html

Medlem sedan feb. 2002141 inlägg
#8

hmm...
så create temporary table x select * from dag order by id desc limit 7 skall fungera i så fall?
Hämtar jag bara data som vanligt från x sedan?
Raderas tabellen automatiskt?

Medlem sedan feb. 2002141 inlägg
#9

Det fungerade!

Vid själva registreringen av besökare kollas om ett ip-nummer finns med bland drygt 500 000 andra. Om man skapar en temp-tabell för kanske de som är till just den användaren (statistikid), skulle det innebära förbättrat prestanda?

Det som fungerar nu:

Connect.Execute("CREATE TEMPORARY TABLE temp SELECT * FROM dag WHERE tillid='"&iID&"' ORDER BY id DESC limit 7")
maxantal = Connect.Execute("SELECT Sum(antal) FROM temp WHERE tillid='"&iID&"'").Fields(0)
Connect.Execute("DROP TABLE temp")

Det står att tabellen automatiskt raderas vid connect.Close, men tydligen måste den raderas så (?)

262 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)