Ämne: SQL-fråga
Visa ett inlägg
Oläst 2009-06-26, 07:39 #1
Innocast Innocast är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Aug 2004
Inlägg: 688
Innocast Innocast är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Aug 2004
Inlägg: 688
Hej,

Sitter här på morgonkvisten och funderar lite över hur jag ska formulera en SQL-fråga. Vad jag har är en ständigt växande tabell. Jag har en kolumn som är en ENUM( 'true', 'false' ), låt oss kalla den `active`. Default-värdet är 'true'.

Vad jag är ute efter är att endast ha de senaste X raderna satta till true och resten till false. Prövade med följande:

UPDATE `table` SET `active` = 'false' ORDER BY `id` DESC LIMIT X,1000

I mina ögon så sorterar den tabellen bakvänt och tar 1000 rader efter rad X och sätter dom till false. Men det fungerade inte. Prövade även denna sub query variant som inte heller fungerade...

UPDATE `table` SET `active` = 'false' WHERE `active` = 'true' ORDER BY `id` DESC LIMIT ( SELECT COUNT(*) FROM `table` WHERE `active` = 'true') - X

Notera att jag bytt ut X mot ett värde.

Jag skulle ju kunna göra två frågor av det hela, en som räknar ut alla rader och därefter gör en update på det föregående resultatet minus 20. Men det känns inte optimalt.

Scriptet kommer att köras var 5:e minut via crontab och se till att tabellen aldrig blir överfull. Har nämligen en indexerng på `active`och gör väldigt många urval på just rader med `active` = 'true'.

Några tips?
Innocast är inte uppkopplad   Svara med citatSvara med citat