Autor Zpráva
Petr Ká
Profil
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
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
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'");
Pozn.: Mám vlastní DB třídu (execute - provede příkaz, select_singles($table, $sloupec, $where=array(),$order=array(),$limit=0) - vrátí jednoduchý array s výsledky)
Kajman
Profil
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: