[ apex @ 05.10.2008. 14:37 ] @
Pozdrav svima, mucim se vec neko vreme oko ovoga pa rek'o ajde da pitam...

Imam tabelu logs i u njoj imam dve kolone LogID (autoincrement) i TimeAdd (vreme upisa loga)

ono sto zelim da uradim je da zadrzim samo zadnjih 200 logova a ovo ostalo da obrisem...

probao sam sa ovom naredbom ali naravno ne mogu da vrsim promene na tabeli koju koristim za upit

DELETE FROM logs WHERE logID != (SELECT logID FROM logs GROUP BY TimeAdd ASC LIMIT 200);

ako neko ima predloga?


[Ovu poruku je menjao apex dana 05.10.2008. u 17:28 GMT+1]
[ Shinhan @ 06.10.2008. 08:19 ] @
El mora baš 200 ili može "da ostane najmanje 200"?
Može na više načina, naročito ako baš ne mora da bude iz jednog upita.

Ili da uzmeš datum 200. zapisa i obrišeš sve starije od toga:
SELECT TimeAdd FROM logs ORDER BY TimeAdd DESC LIMIT 200, 1;
DELETE FROM logs WHERE TimeAdd < "{datumpreuzetizgornjegupita}";

ili da prebrojiš koliko ima zapisa u logu i obrišeš ukupno-200
SELECT COUNT(*) FROM logs;
DELETE FROM logs ORDER BY TimeAdd LIMIT {ukupno-200}; // ne pokretati ovu komandu ako ukupno nije veće od 200!

Prvi slučaj mislim se sigurniji a sporiji.
Drugi slučaj može isprazniti celu tabelu ako se slučajno dva puta pokrene druga komanda ali je zato mnogo brži (naročitao ako je MyISAM tabela pa je count linija samo upit ka indexu).
E sad, ako inače nemaš puno rekorda u tabeli, brzina ti neče biti baš nešto važna.

Treće rešenje, ako ti je baš važno da nikad nemaš više od 200 je da pri svakom insertu radiš i brisanje najstarijeg reda.
[ apex @ 06.10.2008. 13:05 ] @
Citat:
Ili da uzmeš datum 200. zapisa i obrišeš sve starije od toga:
SELECT TimeAdd FROM logs ORDER BY TimeAdd DESC LIMIT 200, 1;
DELETE FROM logs WHERE TimeAdd < "{datumpreuzetizgornjegupita}";


ovako nesto mi bas odgovara, hvala na pomoci