Удаление лишних строк в базе

KoLoB

Guest
Удаление лишних строк в базе

У меня есть база, в которой храняться сообщения пользователей...
Периодически пользователи добавляют в неё сообщения...
В итоге база стала громадных размеров и выборка идёт долго...

Надо сделать очистку базы, т.е. удаления старых сообщений...
Причём так, чтоб оставалось 20 последних сообщений у КАЖДОГО пользователя...

Т.е. например если у меня после выборки 21 строка для пользователя с id=2 (id - поле - идентификатор пользователя), то мне надо удалить первую строку (она самая старая)для пользователя с этим id. Если в результате 25 строк, то надо удалить 5 самых старых строк. И так далее...

Думаю объяснил задачу нормально...
 

KoLoB

Guest
А можно узнать как это?

Да действительно можно было б сделать так!

mysql_query("select ... [skipped]... limit 20"); - у меня будет 20 записей, а как удалить остаток записей, т.е. записей с этим же id, вот только непопавших в эту выборку?
 

rotoZOOM

ACM maniac
а ты узнай общее кол-во записей для данного юзера (пусть будет N) а потом удаляй LIMIT N-20.
Либо сортировку сделай в обратном порядке (то есть первая выборка - это самое последнее сообщение) и потом удаляй начиная с 20
 

KoLoB

Guest
Т.е.
$result=mysql_query("select ... from messages where id=5 limit 20;");
$n=mysql_num_rows($result);

А как дальше удалить тогда сообщения?
 

rotoZOOM

ACM maniac
первая строчка тебе зачем ? это ты выборку 20 сообщений делаешь, тебе это зачем ?
PHP:
$result=mysql_query("delete from messages where id=5 limit 20,1000000000 ORDER BY <условие по убыванию>;");
 

KoLoB

Guest
mysql_query=("delete from messages where id=5 limit 20-$n";);

Так, да?
 

rotoZOOM

ACM maniac
Так, но это тебе сначала надо определить общее кол-во записей. А вот мой предыдущий пост за 1 запрос удаляет.
 

KoLoB

Guest
Автор оригинала: rotoZOOM
первая строчка тебе зачем ? это ты выборку 20 сообщений делаешь, тебе это зачем ?
PHP:
$result=mysql_query("delete from messages where id=5 limit 20,1000000000 ORDER BY <условие по убыванию>;");
PHP:
$result=mysql_query("delete from messages where id=5 limit 20,1000000000 ORDER BY desc;");
А почему limit 20,1000000000

Надо вроде limit $-20
 

KoLoB

Guest
Т.е. весь код будет

PHP:
$result=mysql_query("select ... from messages where id=5 ;");
$n=mysql_num_rows($result);
mysql_query=("delete from messages where id=5 limit $n-20";);
 

yugene

Отошел от дел
Автор оригинала: KoLoB
Т.е.
$result=mysql_query("select ... from messages where id=5 limit 20;");

А как дальше удалить тогда сообщения?
Извлекаешь ID полученных 20 записей, склеиваешь их в массив через запятую и делаешь DELETE FROM ... WHERE user=5 AND id NOT IN (склеенный_массив_через_запятую)

-~{}~ 24.02.05 13:27:

Автор оригинала: KoLoB
Т.е. весь код будет

PHP:
$result=mysql_query("select ... from messages where id=5 limit;");
$n=mysql_num_rows($result);
mysql_query=("delete from messages where id=5 limit $n-20";);
Ну или так. Но не забыв сделать ORDER, иначе LIMIT ничего хорошего не даст.
 

KoLoB

Guest
Если у меня
$result=mysql_query("SELECT *** ORDER BY num DESC");

То что мне делать?
 

KoLoB

Guest
Спасибо, ребята очень помогли!

Правда мне пришлось обновить версию mysql с 3.23 на 4.1. (не знаю правда теперь какая версия на моём хостинге.... :( )

И чуть - чуть пришлось поправить код:

PHP:
$result=mysql_query("SELECT ... ORDER BY num DESC");
$n=mysql_num_rows($result); 
$l=$n-20;
mysql_query("delete from messages where id=$id  ORDER BY num ASC LIMIT $l");
По другому (limit $n-20) почему то рнр отказывалось делать :(.

-~{}~ 24.02.05 13:47:

Тему можно закрывать/удалять!
 

Dreamer76

Through thorns
Лучше просто закрыть :) Мало ли..

-~{}~ 25.02.05 15:54:

Лучше просто закрыть :) Мало ли..
 
Сверху