Autor | Zpráva | ||
---|---|---|---|
Petr Ká Profil |
#1 · Zasláno: 8. 12. 2013, 14:20:47
Ahoj,
potřeboval bych poradit s SQL, jak mazat záznamy z databáze spjaté k user_id a smena_id kdyz chci zachovat pouze pro příklad 50 nejnovějších záznamů. Předem díky |
||
Antik4 Profil |
#2 · Zasláno: 8. 12. 2013, 15:57:37
Pomocí cronu kontrolovat záznamy a nebo při každém vložení, zda je více záznamu než 50 .
|
||
Petr Ká Profil |
Ano, to chápu, ale jde mi o daný SQL dotaz...
Tipuji, že by to mělo být něco na způsob: DELETE FROM zalohy WHERE user_id='$uid' AND smena_id='$sid' AND id NOT IN ( SELECT id FROM zalohy WHERE user_id='$uid' AND smena_id='$sid' ORDER BY id DESC LIMIT 40 ) ale nejsem si tím moc jist EDIT: Tak jsem to risknul a výsledek zní: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' EDIT 2: Verze MySQL: 5.5.31 |
||
Antik4 Profil |
Zkusil bych něco jako tohle (Neodzkoušeno)
DELETE FROM zalohy WHERE user_id = '$uid' AND smena_id = '$sid' AND (SELECT COUNT(*) FROM zalohy WHERE user_id <= '$uid') < 40 (SELECT COUNT(*) FROM zalohy WHERE user_id <= '$uid') - Zjištění pozice
|
||
Kajman Profil |
#5 · Zasláno: 9. 12. 2013, 14:54:14
Moc nechápu důvod mazání. Data něčemu vadí?
Snad by šlo něco takového... DELETE FROM z USING zalohy z JOIN (SELECT zg.*, (SELECT zh.id FROM zalohy zh WHERE zh.user_id = zg.user_id AND zh.smena_id = zg.smena_id ORDER BY zh.id DESC LIMIT 50, 1) hranice FROM (SELECT user_id, smena_id FROM zalohy GROUP BY user_id, smena_id) zg) m ON z.user_id = m.user_id AND z.smena_id = m.smena_id AND z.id <= m.hranice |
||
Petr Ká Profil |
Kajman:
- No víceméně... Spíš více než méně, jsou zbytečná a při tom množství uživatelů tabulka neuvěřitelně roste - Tam je právě ten problém, že mi nebere LIMIT v poddotazech EDIT: Tak nevím, jestli by nebylo jednodušší to udělat 2ma dotazy (ale samozřejmě se vždy snažím udělat maximum jedním) něco např.: $db->execute( "DELETE FROM zalohy WHERE id NOT IN (". implode( ", ", array_map("intval",$db->select_singles("zalohy", "id",array("user_id"=>$uid,"smena_id"=>$sid),array("id"=>"DESC"),50)) ).") AND user_id = '$uid' AND smena_id='$sid'"); |
||
Kajman Profil |
#7 · Zasláno: 12. 12. 2013, 16:18:09
Petr Ká:
„Tam je právě ten problém, že mi nebere LIMIT v poddotazech“ U delete je rozdíl v použití limitu v poddotaze umístěném ve where a v poddotaze použitém pro spojení tabulek. Pokud budete řešit mazání dvěma dotazy, tak si nezpomeňte tabulku na tu dobu zamčít. Případně nehledat zachovaná id, ale např. maximální id z těch, co se mají u toho uživatele mazat, a mazat menší nebo rovno. Jinak se může přihodit, že si smažete zálohu vkládanou mezi těmi dvěma dotazy. |
||
Časová prodleva: 10 let
|
0