Просмотр полной версии : Нужна помощь по SQL
Freakazoitt
26.12.2009, 15:21
В таблице лежат записи, сортируются по времени (ячейка "t", время в секундах запись типа 1261728614)
Как удалить все ранние строки, оставив 30 новых?
Regis Filius
26.12.2009, 16:14
DELETE FROM `table` WHERE `t` NOT IN (SELECT `t` FROM `table` ORDER BY `t` DESC LIMIT 0, 30)
Не уверен, что составил запрос правильно. Никогда раньше не делал такого. Проверить не получается, так как версия MySQL не поддерживает подзапрос LIMIT в NOT IN.
Freakazoitt
26.12.2009, 18:03
чета не работает
опции top или last или bottom и order by есть?
Freakazoitt
26.12.2009, 18:04
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
Freakazoitt
26.12.2009, 18:08
t nick uin time room msg
1261736894 test 10 19:28 4!4 ccccccccccccccccccccccccccccccccccccccc
1261728614 test 10 17:10 4!4 Hello, world!
1261728627 test 10 17:10 4!4 1
1261728629 test 10 17:10 4!4 2
вот записи, надо в room 4!4 выбрать 30 последних строк и остальное стереть
попробуй
select top 30 T from TABLENAME order by T desc
Freakazoitt
26.12.2009, 18:15
команду top не понимает
ID записей есть? Тогда начинай по ним вычислять. Потом сортирни и удали.
Freakazoitt
26.12.2009, 18:29
нету ID, надо чтоб автоматически удалялось, типа очистка чата
Regis Filius
26.12.2009, 19:15
Чат? Может не надо удалять, а просто выводить последние 30 сообщений? Остальные сообщения выводить уже в архиве или вовсе не показывать. Никогда не бывает лишним заглянуть в то, что говорили, когда тебя не было :) Как вариант можно тупо сделать несколько запросов. На проверку количества сообщений. Если больше 30, то удаляет последнее, и потом записывает новое сообщение. Если меньше 30, то просто записывает.
Freakazoitt
26.12.2009, 19:42
Дело в том, что получается только удалять последние записи, а не первые.
и вообще не понятно как это делается, а если занаво всё переделывать, то в других местах ещё надо переписывать много.
Как-то непонятно база спланирована, по идее в любой таблице должен быть какой-нить айдишник. Если здесь им является время - с точки зрения емкости памяти и экрана неправильно.
Альтерни к этой табле инкрементный айдишник и всё!
Freakazoitt
26.12.2009, 21:29
допустим там будет id, а дальше?
мне на оптимизацию всё равно, главное чтобы старое само удалялось
delete from TABLNAME where ID<((select max(ID) from TABLENAME)-30)
это если инкремент +1 поставишь
Freakazoitt
26.12.2009, 22:27
спасибо, наверно работает, проверю потом устал
Freakazoitt
26.12.2009, 22:34
вот так вроде правильней
delete from TABLENAME where ID<((select max(ID))-30)
вот так вроде правильней
delete from TABLENAME where ID<((select max(ID))-30)
Не знаю я MySQL, никогда с ним не сталкивался. Может и правильней.
Пробуй. Главное, принцип определить, а реализация - дело техники.
Strelockk
26.03.2010, 23:39
По id это одно, так же можно ведь и время использовать... если t у тебя UNIX_TIMESTAMP то просто сравнивай время, тут можно будет тогда контролировать, на сколько старые сообщения нужно удалять...
vBulletin® v3.6.3, Copyright ©2000-2024, Якутск-Online. Перевод: zCarot