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

Форум MySQL

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

 

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

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

тема: Как удалить старые записи?
 
 автор: а-я   (31.01.2009 в 20:53)   письмо автору
 
 

Всем привет. такая проблемкО..
имеем 2 таблицы


таблица `tbl_1`:
`uid_1`(int)
`uid_2`(int)
`status`(tinyint)


2ая таблица `tbl_2`:
`uid_1`(int)
`uid_2`(int)
`time`(timestamp)
`read`(tinyint)



мне надо удалить из 1таблицы
все записи где

`tbl_1`.`status`=0
AND
`tbl_1`.`uid_1` = `tbl_2`.`uid_1`
AND
`tbl_2`.`uid_2` = `tbl_2`.`uid_2`
AND
`tbl_2`.`read`=0
AND
MAX(`tbl_2`.`time`) < NOW() - INTERVAL 10 MINUTE

основная проблема узнать макс. время.

  Ответить  
 
 автор: Trianon   (31.01.2009 в 21:15)   письмо автору
 
   для: а-я   (31.01.2009 в 20:53)
 

попробуйте сперва и вправду максимальное время узнать для каждой пары uid1 uid2

  Ответить  
 
 автор: а-я   (31.01.2009 в 21:27)   письмо автору
 
   для: Trianon   (31.01.2009 в 21:15)
 

т.е. сделай отдельный запрос?
или сделать подзапрос?


`tbl_1`.`status`=0 
AND 
`tbl_1`.`uid_1` = `tbl_2`.`uid_1` 
AND 
`tbl_2`.`uid_2` = `tbl_2`.`uid_2` 
AND 
`tbl_2`.`read`=0 
AND 
(SELECT MAX(c.`time`) FROM `tbl_2` c WHERE 
c.`uid_1`=`tbl_1`.`uid_1` AND c.`uid_2`=`tbl_1`.`uid_2` AND c.`read`=0 
LIMIT 1) < NOW() - INTERVAL 10 MINUTE

что-то в этом роде?

  Ответить  
 
 автор: Trianon   (31.01.2009 в 21:36)   письмо автору
 
   для: а-я   (31.01.2009 в 21:27)
 

скорее JOIN с таблицей-подзапросом.

DELETE tbl1 
FROM tbl1 JOIN 
  (SELECT uid_1, uid_2, MAX(`time`) AS t FROM tbl2 
    WHERE read = 0
    GROUP BY uid1, uid2 
    HAVING t < NOW - INTERVAL 10 MINUTE
  ) USING (uid_1, uid_2)
 WHERE status = 0

как-то так

  Ответить  
 
 автор: а-я   (31.01.2009 в 21:42)   письмо автору
 
   для: Trianon   (31.01.2009 в 21:36)
 

что не идет.. сначалса ругался read взял `read`
теперь ругается

#1248 - Every derived table must have its own alias

  Ответить  
 
 автор: Trianon   (31.01.2009 в 22:04)   письмо автору
 
   для: а-я   (31.01.2009 в 21:42)
 

ну так дайте алиас, раз просит.
) AS t ON tbl1.uid_1=t.uid_1 AND tbl1.uid_2=t.uid_2
WHERE status = 0

  Ответить  
 
 автор: а-я   (31.01.2009 в 22:11)   письмо автору
 
   для: Trianon   (31.01.2009 в 22:04)
 

все!) большое спасибо!))
это то что мне надо!))

  Ответить  
 
 автор: а-я   (31.01.2009 в 22:19)   письмо автору
 
   для: Trianon   (31.01.2009 в 22:04)
 

-

  Ответить  
 
 автор: а-я   (31.01.2009 в 21:54)   письмо автору
 
   для: Trianon   (31.01.2009 в 21:36)
 

-

  Ответить  
 
 автор: а-я   (31.01.2009 в 23:26)   письмо автору
 
   для: Trianon   (31.01.2009 в 21:36)
 

а трудно будет добавить удаление записей, которых вообще нет во 2ой таблице?

т.е. мы до этого из 1ой удаляли записи ориентируясь по записям 2ой таблицы.
а вот если во 2ой их не будет.. можно как-то их тоже вкл. под удаление?

наверно надо использовать LEFT JOIN?

  Ответить  
 
 автор: а-я   (07.02.2009 в 19:38)   письмо автору
 
   для: а-я   (31.01.2009 в 23:26)
 

что-то никак доделать не могу...
а именно добавить в условие те записи, которых нет во 2ой...

  Ответить  
 
 автор: Trianon   (07.02.2009 в 21:28)   письмо автору
 
   для: а-я   (07.02.2009 в 19:38)
 

Общий подход
DELETE tbl1 
  FROM tbl1 LEFT JOIN tbl2 
    ON условие, описывающее соответствие записей в таблицах, которые нужно оставить
  WHERE tbl2.id IS NULL 

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

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