PDA

Просмотр полной версии : Нужна помощь по 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
чета не работает

Vadson
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 последних строк и остальное стереть

Vadson
26.12.2009, 18:09
попробуй
select top 30 T from TABLENAME order by T desc

Freakazoitt
26.12.2009, 18:15
команду top не понимает

Vadson
26.12.2009, 18:22
ID записей есть? Тогда начинай по ним вычислять. Потом сортирни и удали.

Freakazoitt
26.12.2009, 18:29
нету ID, надо чтоб автоматически удалялось, типа очистка чата

Regis Filius
26.12.2009, 19:15
Чат? Может не надо удалять, а просто выводить последние 30 сообщений? Остальные сообщения выводить уже в архиве или вовсе не показывать. Никогда не бывает лишним заглянуть в то, что говорили, когда тебя не было :) Как вариант можно тупо сделать несколько запросов. На проверку количества сообщений. Если больше 30, то удаляет последнее, и потом записывает новое сообщение. Если меньше 30, то просто записывает.

Freakazoitt
26.12.2009, 19:42
Дело в том, что получается только удалять последние записи, а не первые.
и вообще не понятно как это делается, а если занаво всё переделывать, то в других местах ещё надо переписывать много.

Vadson
26.12.2009, 21:05
Как-то непонятно база спланирована, по идее в любой таблице должен быть какой-нить айдишник. Если здесь им является время - с точки зрения емкости памяти и экрана неправильно.
Альтерни к этой табле инкрементный айдишник и всё!

Freakazoitt
26.12.2009, 21:29
допустим там будет id, а дальше?

мне на оптимизацию всё равно, главное чтобы старое само удалялось

Vadson
26.12.2009, 22:21
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)

Vadson
26.12.2009, 22:40
вот так вроде правильней

delete from TABLENAME where ID<((select max(ID))-30)

Не знаю я MySQL, никогда с ним не сталкивался. Может и правильней.
Пробуй. Главное, принцип определить, а реализация - дело техники.

Strelockk
26.03.2010, 23:39
По id это одно, так же можно ведь и время использовать... если t у тебя UNIX_TIMESTAMP то просто сравнивай время, тут можно будет тогда контролировать, на сколько старые сообщения нужно удалять...