跨mysql中的多个表的条件删除

时间:2014-06-08 10:17:47

标签: mysql sql

我有两张桌子。其中一个包含文件,另一个包含操作:

|Files    |                  |Actions     |
|---------|                  |------------|
|FileID   |                  |ActionID    |
|Filename |                  |ActionDate  |
|...      |                  |...         |
|---------|                  |------------| 

一个文件可以有多个操作。这些行动发生在某个特定日期。

我偶尔会删除所有文件及其操作。但是,只有当该文件的某个操作比 - 比如说 - 1年更早时。

例如:

文件1有2个动作:两个动作都发生在一周前。不要删除

文件2有2个动作:两个动作都发生在10年前。删除

文件3有两个动作:其中一个发生在10年前,另一个发生在半年前。删除

我很乐意这样做,而无需分几步完成。 (比如首先在我的perl脚本中选择东西,然后迭代那些删除它们或其他东西)

如果这太容易了,我可以提供进一步的挑战: 还有另一张桌子,我们称之为“状态”。一个州可以再次执行多个操作,我还想删除将要删除的操作所引用的所有状态。

有关如何做到这一点的任何提示都受到高度赞赏!

修改 哦,我刚刚意识到,一次性从多个表中删除是非常不鼓励的,特别是在处理大量数据时。 我认为这意味着在sql中没有(体面的)方法这样做,对吗?

1 个答案:

答案 0 :(得分:2)

对于文件和操作,您首先需要查找一年后行动之一的文件,这可以使用以下查询来完成

select *,
sum(ActionDate < now() - interval 1 year) need_to_delete
from 
Actions 
group by FileID
  having need_to_delete >0

这将为您提供需要从数据库中删除的文件ID

Select Demo

其次,您需要使用上述查询加入多删除查询,以便从单个查询中的多个表中删除

delete f.*,a.* from files f
join Actions a
on(f.FileID = a.FileID)
join (
  select *,
sum(ActionDate < now() - interval 1 year) need_to_delete
from 
Actions 
group by FileID
  having need_to_delete >0
) fa
on(f.FileID = fa.FileID)

Delete Demo

删除以上状态查询将帮助您,我将其留给