情况
我的目标是每年进行一次 cronjob,根据年龄从数据库中删除某些数据。就我而言,我拥有 Bash 和 MySQL 的强大功能。我从编写一个 bash 脚本开始,但后来让我感到震惊的是,也许我可以只用一个 SQL 查询来完成所有事情。
我本质上更像是一名程序员,而且我对数据结构没有太多经验,所以这就是我想要一些帮助的原因。
表/数据结构
该查询的相关表和列如下:
登记:
+-----+-------------------+
| Id | Registration_date |
+-----+-------------------+
| 2 | 2011-10-03 |
| 3 | 2011-10-06 |
| 4 | 2011-10-07 |
| 5 | 2011-10-07 |
| 6 | 2011-10-10 |
| 7 | 2011-10-13 |
| 8 | 2011-10-14 |
| 9 | 2011-10-14 |
| 10 | 2011-10-17 |
+-------------------------+
关联客户:
+-----------+-----------------+
| Client_id | Registration_id |
+-----------+-----------------+
| 2 | 2 |
| 3 | 2 |
| 3 | 4 |
| 4 | 5 |
| 3 | 6 |
| 5 | 6 |
| 3 | 8 |
| 8 | 9 |
| 7 | 10 |
+-----------------------------+
客户:这里只有 ID 是相关的。
如您所见,这是一个简单的多对多关系。一个客户的名字可以有多个注册,一个注册可以有多个客户。
目标
我需要删除 5 年内未进行新注册的客户的所有注册和客户数据。听起来很简单,对吧?
棘手的部分
如果特定客户的任何注册的任何其他客户在5 年内重新注册,则应保留该数据。
所以想象客户 A 有 4 个注册,其中只有他,1 个注册他自己和客户 B。所有 5 个注册都超过 5 年。如果客户 B 在 5 年内没有新的注册,则应删除所有内容:客户 A 的注册和记录。如果 B确实在 5 年内进行了新注册,则应保留所有客户 A 的数据,包括他自己的旧注册。
我试过的
建立我的查询,我得到了这么多:
DELETE * FROM `Registration` AS Reg
WHERE TIMESTAMPDIFF(YEAR, Reg.`Registration_date`, NOW()) >= 5
AND
(COUNT(`Id`) FROM `Registration` AS Reg2
WHERE Reg2.`Id` IN (SELECT `Registration_id` FROM `AssociatedClient` AS Clients
WHERE Clients.`Client_id` IN (SELECT `Client_id` FROM `AssociatedClient` AS Clients2
WHERE Clients2.`Registration_id` IN -- stuck
#I need all the registrations from the clients associated with the first
# (outer) registration here, that are newer than 5 years.
) = 0 -- No newer registrations from any associated clients
请理解,我在 SQL 方面的经验非常有限。我意识到,即使到目前为止我得到的也可以进行大量优化(使用连接等),甚至可能不正确。
我被卡住的原因是,如果我可以使用某种循环,我想到的解决方案会起作用,我只是意识到这不是你在这种 SQL 查询中容易做的事情。
任何帮助
非常感谢。