Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Автоудаление старых сообщений
 
 автор: ivanov_max   (13.08.2009 в 02:26)   письмо автору
 
 

Помогите составить запрос на удаление старых сообщений
вот такая таблица

CREATE TABLE outbox (
outbox_id INTEGER NOT NULL PRIMARY KEY,
outbox_send varchar(20) NOT NULL,
outbox_text TEXT NOT NULL,
outbox_time INTEGER UNSIGNED NOT NULL,
outbox_user varchar(20) NOT NULL
);


при добавлении нового сообщения нужно проверить если в таблице более 10 сообщений удалить самое старое

я делал вот такой запрос
сперва считал сколько у пользователя сообщений и если более 10 то выполнять след. код

"SELECT outbox_id FROM outbox WHERE outbox_user='".$log."' ORDER BY outbox_time ASC LIMIT 1;"
получал самую старую id по времени
"DELETE FROM outbox WHERE outbox_id='".$lastid."';" и удалял



но потом тут в форуме увидел такой код


"DELETE FROM outbox WHERE outbox_id < ( 
  SELECT MIN(outbox_id) FROM 
  ( 
    SELECT outbox_id FROM outbox 
    ORDER BY outbox_id DESC LIMIT 10 
  ) AS s 
) AND outbox_user='".$log."';


только тут не по времени а по id проверяется, и этот код выполняется каждый раз при добавлении, какой из них более лучший
p.s. второй код иногда непонятно удаляет

  Ответить  
 
 автор: heed   (13.08.2009 в 08:05)   письмо автору
 
   для: ivanov_max   (13.08.2009 в 02:26)
 

ещё такой вариант
DELETE  FROM outbox
 WHERE (SELECT
`TABLE_ROWS` FROM information_schema.tables 
WHERE `TABLE_SCHEMA` ='test' AND `TABLE_NAME` ='outbox')>9
ORDER BY outbox_time
 LIMIT 1

TABLE_SCHEMA` ='test' AND `TABLE_NAME` ='outbox'
это названия базы данных и таблицы

  Ответить  
 
 автор: Trianon   (13.08.2009 в 10:42)   письмо автору
 
   для: heed   (13.08.2009 в 08:05)
 

Когда Вам в ванной комнате надо воду в душе открыть/закрыть, Вы сантехника со сварочным аппаратом зовете?

  Ответить  
 
 автор: ivanov_max   (13.08.2009 в 11:43)   письмо автору
 
   для: heed   (13.08.2009 в 08:05)
 

что-то по вашему я не очень понял
как вариант я думаю может лучше вычислить сколько сообщений всего и если более 10 то сделать так
DELETE FROM outbox WHERE outbox_id=(SELECT MIN(outbox_id) FROM outbox WHERE outbox_user='".$log."' LIMIT 1);

  Ответить  
 
 автор: Trianon   (13.08.2009 в 10:41)   письмо автору
 
   для: ivanov_max   (13.08.2009 в 02:26)
 

outbox_user='".$log."'; во внутреннем селекте у Вас пропущено. Отсюда и глюки.

  Ответить  
 
 автор: ivanov_max   (13.08.2009 в 12:03)   письмо автору
 
   для: Trianon   (13.08.2009 в 10:41)
 

спасибо
теперь выводит то что нужно все старые сообщения кроме 10 последних
SELECT outbox_id FROM outbox WHERE outbox_id < (  
  SELECT MIN(outbox_id) FROM  
  (  
    SELECT outbox_id FROM outbox  
    WHERE outbox_user='".$log."'
    ORDER BY outbox_id DESC LIMIT 10  
  ) 
) AND outbox_user='".$log."';

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования