Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何删除所有最旧的记录,直到某些数字字段的总和达到某个值(TOT)_Mysql - Fatal编程技术网

Mysql 如何删除所有最旧的记录,直到某些数字字段的总和达到某个值(TOT)

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' ..

在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' .... 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)