Autor | Zpráva | ||
---|---|---|---|
wordik Profil * |
#1 · Zasláno: 20. 12. 2009, 11:54:56
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 |
#2 · Zasláno: 20. 12. 2009, 12:12:17 · Upravil/a: Alphard
wordik:
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. |
||
Časová prodleva: 5 dní
|
|||
wordik Profil * |
#3 · Zasláno: 25. 12. 2009, 21:39:24
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 |
#4 · Zasláno: 25. 12. 2009, 21:49:13 · Upravil/a: Alphard
wordik:
„jenže já myslel, že to půjde udělat nějak podle toho, kolik je tam příspěvků.“ 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 * |
#5 · Zasláno: 25. 12. 2009, 22:03:10
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 * |
#6 · Zasláno: 25. 12. 2009, 22:08:59
: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 * |
#7 · Zasláno: 27. 12. 2009, 00:03:26
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 |
#8 · Zasláno: 27. 12. 2009, 00:46:35 · Upravil/a: Alphard
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í. |
||
Časová prodleva: 3 dny
|
|||
wordik Profil * |
#9 · Zasláno: 30. 12. 2009, 00:15:55
Alphard:
V pořádku, zase jsme o něco chytřejší :-). Jinak děkuji za řešení, to bude postačující. |
||
Časová prodleva: 14 let
|
0