Autor Zpráva
wordik
Profil *
Dobrý den, mám tabulku pro chat s touto strukturou:
id
username
ip
text
added
site

A já potřebuji smazat všechny záznamy v tabulce a ponechat pouze 50 nejnovějších, kde site = 1;
to samé potřebuji udělat i s podmínkou site = 2;

DELETE FROM `chat` WHERE `site` = 1 ORDER BY `id` ASC LIMIT (SELECT COUNT(*) FROM `chat` WHERE `site` = 1);

- takhle to samozřejmě nefunguje, jen abych Vám nazorně ukázal, co potřebuji.

Děkuji předem.
Alphard
Profil
wordik:
delete from tabulka order by id desc 50, 5000
Tohle ani není vhodné provádět při každém načtení stránky (kvůli výkonu).
Takže vybírejte s limitem
select * from tabulka limit 50

A jednou za čas ty staré smažte.
wordik
Profil *
Alphard:
Ten SQL dotaz vypisuje chybku:
...he right syntax to use near '50, 5000' at line 1...


Jinak na webu samozřejmě vybírám pouze 50 příspěvků a ten čistící skript by se pouštěl každý měsíc, jenže já myslel, že to půjde udělat nějak podle toho, kolik je tam příspěvků.

Něco pokud > 50 - smazat všechny příspěvky nad 50 a nechat tam jen 50tku
a pokud <= 50 tak nic nedělat
- něco podobného, vím že tahle složitost asi v SQL samotném nepůjde, při nejhorším, když to nepůjde vůbec, tak to udělám v PHPku.

Díky předem za rady
Alphard
Profil
wordik:
jenže já myslel, že to půjde udělat nějak podle toho, kolik je tam příspěvků.
Nějak by to šlo, ale není to nutné. Stačí přeskočit těch 50 a pak dát dostatečně velké rozmezí, těch 5000 jsem střelil od boku, upravte si to podle potřeby.
V tom dotazu mi chybí limit, jinak by měl být ok.
delete from tabulka order by id desc limit 50, 5000
123456789
Profil *
Taky to můžete udělat třeba takto: DELETE FROM [table_name] WHERE Id < (SELECT MAX(Id) - 50 FROM [table_name]);

Celé si to můžete uložit do procedury, viz. třeba: http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html
123456789
Profil *
:D aha tak ne: Currently, you cannot delete from a table and select from the same table in a subquery -- http://dev.mysql.com/doc/refman/5.0/en/delete.html no každopádně v každé databázi by to šlo
wordik
Profil *
Alphard:
Jasně, já ten dotaz předtím nepochopil, teď už to chápu.
Ovšem stýle mi to hází stejnou chybu, už si začínám myslet, že pri delete nejde nastavit rozmezí, protože pokud spustím:
select * from tabulka order by id desc limit 50, 5000


tak dotaz bez problému proběhne, ale pokud spustím:
delete from tabulka order by id desc limit 50, 5000


pak se zase objeví předchozí chybová hláška:
...he right syntax to use near '50, 5000' at line 1...


123456789:
Děkuji za pomoc, ale Alphardovo řešení je dostačující.
Alphard
Profil
wordik:
Moc se omlouvám, ale moje řešení je nefunkční. Nechápu, proč mě za ten týden nikdo neopravil a že jsem na to nenarazil sám.
Podle MySQL :: MySQL 5.0 Reference Manual :: 12.2.2 DELETE Syntax při delete nelze v MySQL zadat offset.
Momentálně mě napadají jenom tři řešení:
1. spočítat řádky, odečíst těch 50, seřadit obráceně a smazat s klasickým limitem
2. část dat přesunout do pomocné tabulky, vše smazat, vrátit zpět
3. změnit databázi

Asi nejjednodušší bude rozdělit to, co jste psal na začátku, do dvou dotazů.
$count = mysql_result(mysql_query("select count(*) from chat"), 0 , 0);
mysql_query("delete from chat order by id limit ".($count-50));

Ani není nutné zamykat tabulku, když se tam mezitím něco vloží, ničemu to nevadí.
wordik
Profil *
Alphard:
V pořádku, zase jsme o něco chytřejší :-). Jinak děkuji za řešení, to bude postačující.

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: