Mysql 如何删除所有最旧的记录,直到某些数字字段的总和达到某个值(TOT)
在MySQL 5.0的表中,我希望删除最早的记录,直到一些数字字段的总和达到称为TOT some threshold的特定值 表中有以下字段:Mysql 如何删除所有最旧的记录,直到某些数字字段的总和达到某个值(TOT),mysql,Mysql,在MySQL 5.0的表中,我希望删除最早的记录,直到一些数字字段的总和达到称为TOT some threshold的特定值 表中有以下字段: ID, field0 (varchar), field1 (INT), field2 (INT), field3 (int), date 我需要一个查询来选择所有最旧的记录,直到达到总和TOT为止 SELECT ID, SUM(field1,field2,field3) as TOT WHERE field0 = '$username' ..
ID, field0 (varchar), field1 (INT), field2 (INT), field3 (int), date
我需要一个查询来选择所有最旧的记录,直到达到总和TOT为止
SELECT ID, SUM(field1,field2,field3) as TOT
WHERE field0 = '$username' .... ORDER BY date ASC
目的:删除较旧的记录,直到3个数字字段的总和达到某个值TOT
有什么建议吗?
谢谢这是一个可以实施的地方 你可以得到总记录集, 按id或插入日期订购,以及 不断地对字段求和,直到达到目标总数,然后 在您的订单列表中选择最新的,并且 删除该范围之外的所有内容。
您可以通过以下方式计算累积总和:
SELECT ID,
(select SUM(field1 + field2 + field3) from t t2 where t2.date <= t.date and t2.field0 = tempdb.field0) as cumsum
from t
WHERE field0 = '$username'
我认为MySQL中的以下功能可以完成删除:
delete from t
where t.id in (select id
from (SELECT ID,
(select SUM(field1 + field2 + field3) from t t2 where t2.date <= t.date and t2.field0 = tempdb.field0) as cumsum
from t
WHERE field0 = '$username'
) tsum
where cumsum <= YOURTHRESHOLD
)
MySQL对delete语句中的自连接非常挑剔。我认为双个子查询解决了这个问题
注意:此代码未经测试,因此可能包含语法错误。因为您尚未给出表的实际表描述。在我的回答中,我使用的是我公司数据库中的一名员工: 在我的Worker表中,我有三个工资字段,类似于field1、field2和field3。具体描述如下:
mysql> DESC `Worker`;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| SSN | varchar(64) | NO | | NULL | |
| name | varchar(64) | YES | | NULL | |
| salary1 | int(11) | YES | | NULL | |
| salary2 | int(11) | YES | | NULL | |
| salary3 | int(11) | YES | | NULL | |
| Date | int(11) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
在这个表中,我添加了日期作为整数,您可以在MySQL中获得实际的数据类型
假设表具有以下元组:
mysql> SELECT * FROM `Worker` ORDER BY `Date` ASC ;
+-----+---------+---------+---------+---------+------+
| SSN | name | salary1 | salary2 | salary3 | Date |
+-----+---------+---------+---------+---------+------+
| 3 | Sumit | 250 | 150 | 100 | 2 |
| 4 | Harsh | 500 | -150 | 900 | 2 |
| 5 | ONE | 100 | 170 | 100 | 9 |
| 2 | Rahul | 300 | 15 | 30 | 10 |
| 1 | Grijesh | 200 | 100 | 50 | 13 |
| 7 | THREE | 1000 | 17 | -200 | 21 |
| 6 | TWO | 50 | -170 | 200 | 27 |
+-----+---------+---------+---------+---------+------+
ASC订单显示在上面的查询中,日期是我所说的类型
假设我需要删除所有的老工人,他们的工资总额刚刚超过你的例子中的阈值TOT。要选择较老的工人,我需要按ASC顺序对工人表进行排序
您可以假定为员工加入公司的日期。所以老是根据加入的日期那的经验
在编写选择查询之前,我将向您展示一些结果:
mysql> SELECT * , `salary1` + `salary2` + `salary3` AS TSalary
-> FROM `Worker` ORDER BY DATE ASC ;
+-----+---------+---------+---------+---------+------+---------+
| SSN | name | salary1 | salary2 | salary3 | Date | TSalary |
+-----+---------+---------+---------+---------+------+---------+
| 3 | Sumit | 250 | 150 | 100 | 2 | 500 |
| 4 | Harsh | 500 | -150 | 900 | 2 | 1250 |
| 5 | ONE | 100 | 170 | 100 | 9 | 370 |
| 2 | Rahul | 300 | 15 | 30 | 10 | 345 |
| 1 | Grijesh | 200 | 100 | 50 | 13 | 350 |
| 7 | THREE | 1000 | 17 | -200 | 21 | 817 |
| 6 | TWO | 50 | -170 | 200 | 27 | 80 |
+-----+---------+---------+---------+---------+------+---------+
7 rows in set (0.01 sec)
TSalary是一个工人作为他的工作得到的总工资,是工资1、工资2和工资3三部分的总和,如上面的查询所示
表中每个子集的各级工资总额是多少:
+-----+---------+---------+---------+---------+------+---------+
| SSN | name | salary1 | salary2 | salary3 | Date | TSalary | SUM(TSalary) at
+-----+---------+---------+---------+---------+------+---------+ each level
| 3 | Sumit | 250 | 150 | 100 | 2 | 500 |500
| 4 | Harsh | 500 | -150 | 900 | 2 | 1250 |500 + 1250= 1750
| 5 | ONE | 100 | 170 | 100 | 9 | 370 |1750 + 370= 2120
| 2 | Rahul | 300 | 15 | 30 | 10 | 345 |2120 + 345= 2465
| 1 | Grijesh | 200 | 100 | 50 | 13 | 350 |2465 + 350= 2815
| 7 | THREE | 1000 | 17 | -200 | 21 | 817 |2815 + 817= 3632
| 6 | TWO | 50 | -170 | 200 | 27 | 80 |3632 + 80 = 3712
+-----+---------+---------+---------+---------+------+---------+
我写了一个查询,选择有工资总和的老员工,根据日期记录,SUMfield1,field2,field3的性质是什么?查看此
SELECT `ssn`, `name`, `salary1` , `salary2` , `salary3`
FROM ( SELECT `ssn`,
`name`,
`salary1` ,
`salary2` ,
`salary3`,
(@total:=@total+ `salary1` + `salary2` + `salary3`) as TSalary
FROM `Worker`, (select @total:=0) t
ORDER BY `Date` ASC ) AS `some_worker`
WHERE (TSalary -(`salary1` + `salary2` + `salary3`)) <= 1500;
+-----+-------+---------+---------+---------+
| ssn | name | salary1 | salary2 | salary3 |
+-----+-------+---------+---------+---------+
| 3 | Sumit | 250 | 150 | 100 |
| 4 | Harsh | 500 | -150 | 900 |
+-----+-------+---------+---------+---------+
2 rows in set (0.00 sec)
SELECT `ssn`, `name`, `salary1` , `salary2` , `salary3`
FROM ( SELECT `ssn`,
`name`,
`salary1` ,
`salary2` ,
`salary3`,
(@total:=@total+ `salary1` + `salary2` + `salary3`) as TSalary
FROM `Worker`, (select @total:=0) t
ORDER BY `Date` ASC ) AS `some_worker`
WHERE (TSalary -(`salary1` + `salary2` + `salary3`)) <= 2000;
+-----+-------+---------+---------+---------+
| ssn | name | salary1 | salary2 | salary3 |
+-----+-------+---------+---------+---------+
| 3 | Sumit | 250 | 150 | 100 |
| 4 | Harsh | 500 | -150 | 900 |
+-----+-------+---------+---------+---------+
| 5 | ONE | 100 | 170 | 100 |
+-----+-------+---------+---------+---------+
3 rows in set (0.00 sec)