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

Форум MySQL

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Алгоритм автоматического удаления объявлений

Сообщения:  [1-10] 

 
 автор: Trianon   (16.05.2007 в 10:34)   письмо автору
 
   для: provodnik   (16.05.2007 в 09:38)
 

> А возможно ли ENUM "на лету" преобразовать в численный тип, для проведения над ним математических операций?

Даже и думать не буду,. ибо это есть ересь мерзкая. Не надо мешать мух в котлеты.
Захочется потом поменять '1', '7', '30' на 'сутки', 'неделя', 'месяц' и всё грохнется со страшной силой.
Хотите гибкости - заведите доп. таблицу, допишите JOIN. Хотите жестко - поставьте выбор из списка. Но так - фу.

   
 
 автор: provodnik   (16.05.2007 в 09:38)   письмо автору
 
   для: Trianon   (16.05.2007 в 09:30)
 

Т.е. Решить мой вопрос одним запросом в данном случае не получается? Я правильно понимаю?

Ну вот, век живи, век учись. Я думал, что поля ENUM более гибки... А возможно ли ENUM "на лету" преобразовать в численный тип, для проведения над ним математических операций?

   
 
 автор: Trianon   (16.05.2007 в 09:30)   письмо автору
 
   для: provodnik   (16.05.2007 в 08:44)
 

Я же написал - если поля типа INT.
А Вы воткнули enum.
enum это всего лишь ярлычок, прибавлять и множить на него - операции неопределенные.
У Вас же по своей физической сути time_delete - величина численная. А не перечислительная.

   
 
 автор: provodnik   (16.05.2007 в 08:44)   письмо автору
 
   для: Trianon   (15.05.2007 в 23:54)
 

Trianon - да, поле time типа INT.

Как я уже писал выше, я начинал с такого запроса, как Вы мне привели. Но к сожалению он выбирает не то, что нужно. В чем то неверно условие...
Наваял "нечто" с условием, проверяющим первое:

<?
    $a 
mysql_query ("SELECT * from board WHERE UNIX_TIMESTAMP() >= `time_delete` * 86400+`time`");
    while(
$qwe mysql_fetch_array($a))
    {    
        
$t time (); // время настоящее
        
$ud = ($qwe['time_delete'] * 86400 $qwe['time']); // время удаления
        
if ($t $ud
        {
            
$del mysql_query ("DELETE FROM `board` WHERE id = ".$qwe['id']." LIMIT 1");
        }
    }
?>

Этот код делает всё правильно. Удалил 62 просроченных строки
А первый запрос удаляет 620 строк из 660...

Вот структура таблицы:
CREATE TABLE `board` (
`id` int(11) NOT NULL auto_increment,
`time` int(11) NOT NULL default '0',
`time_delete` enum('7','14','30','60','90','180','365') NOT NULL default '30',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 PACK_KEYS=0 CHECKSUM=1 AUTO_INCREMENT=676 ;

Никак не могу понять в чём замес...

   
 
 автор: Trianon   (15.05.2007 в 23:54)   письмо автору
 
   для: provodnik   (15.05.2007 в 22:49)
 

Какого типа поля?
Фактически, это было единственной причиной интересоваться структурой. Его-то Вы и не удовлетворили.

Если тип INT , то по идее запрос
DELETE FROM `tab` WHERE UNIX_TIMESTAMP() >= `time_delete` * 86400+`time`

должен решить проблему

   
 
 автор: provodnik   (15.05.2007 в 22:49)   письмо автору
 
   для: Trianon   (15.05.2007 в 18:28)
 

Полей в таблице много, приведу лишь необходимые для работы:

Название таблицы - board

id | time | time_delete

1 | 1175385600 | 14
2 | 1175126400 | 90
3 | 1174780800 | 365

Где time - время добавления строки в БД ( значение ф-ии time() )
time_delete - "срок хранения" в сутках

   
 
 автор: Trianon   (15.05.2007 в 18:28)   письмо автору
 
   для: provodnik   (15.05.2007 в 18:26)
 

Для начала приведите структуру таблицы.

Ну и несколько записей в ней тоже не помешает.

   
 
 автор: provodnik   (15.05.2007 в 18:26)   письмо автору
 
   для: Mirage   (15.05.2007 в 18:21)
 

>просто выполните вот такой запрос
>
DELETE from board WHERE ".$time_now." > ((time_delete * 86400) + time)


К сожалению я с этого начинал... (

   
 
 автор: Mirage   (15.05.2007 в 18:21)   письмо автору
 
   для: provodnik   (15.05.2007 в 18:00)
 

так и правильно вы же не указали условия какие строки надо удалаять

зачем столько проверок делать
просто выполните вот такой запрос
DELETE from board WHERE ".$time_now." > ((time_delete * 86400) + time)

или вот такой
DELETE from board WHERE (TO_DAYS( time_delete) - TO_DAYS( NOW( ) )) < 0

   
 
 автор: provodnik   (15.05.2007 в 18:00)   письмо автору
 
 

Доброго времени суток коллеги.
Сломал всю голову себе. Никак не могу написать код удаления строк из БД.
Происходит вот что: Есть доска объявлений. При добавлении объявления в БД записывается дата добавления и срок хранения. Ну и соответственно удаляться должны только те строки, которые удовлетворяют условию... Я же написал уже два условия для проверки, но всё равно что то неправильные. По достижению какого то "порога" происходит массовое удаление объявлений, причем в несколько "прохоов", т.е при обновлении страницы сначала удаляется примерно 20, при последующем обновлении ~17, потом ~10, ~5, ~1... И на какой то стадии останавливается...

Посмотрите мой код... Или посоветуйте чего-нибудь своё...

<?
// узнаем настоящее время
$time_now time ();

/* выбираем данные из таблицы board, у которых сумма значений time_delete (time_delete это срок хранения (7 или 14 или 30 или 90 или 365 дней)),
переведенный в секунды и time (time это дата подачи объявления (в секундах - 1178115734)) меньше, чем настоящее время */
$query mysql_query ("SELECT * from board WHERE ".$time_now." > ((time_delete * 86400) + time)");
while(
$q mysql_fetch_array($query))
{    
    
// "напрямую" вычисляем дату удаления объявления из базы
    
$data_udaleniya_iz_bazy $q['time_delete'] * 86400 $q['time'];
    
    
// еще раз ставлю условие для пущей проверки
    
if (time () > $data_udaleniya_iz_bazy)
    {
        
$del mysql_query ("DELETE from board LIMIT 1");
    }
}
?>

Заранее спасибо..

   

Сообщения:  [1-10] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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