2

'sテーブルで、いくつかの数値フィールドのSUMがTOT(いくつかのしきい値)と呼ばれる特定の値に達するMySQL 5.0まで、最も古いレコードを削除したいと思います。

テーブルには次のフィールドがあります。

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に達するまで、古いレコードを削除します。

任意のヒント?ありがとう

4

3 に答える 3

0

これは、ストアドプロシージャを実装する場所です

  1. 合計レコードセットを取得できます。
  2. idまたはinsert-dateで並べ替えられ、
  3. 目標の合計に達するまでフィールドを継続的に合計し、その後
  4. 注文リストの最新情報を取得し、
  5. その範囲外のすべてを削除します。
于 2013-01-23T15:26:15.533 に答える
0

この方法で累積合計を計算できます。

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ステートメント内の自己結合に注意を払っています。二重サブクエリがこの問題を解決すると思います。

注: このコードはテストされていないため、構文エラーが含まれている可能性があります。

于 2013-01-23T18:56:34.110 に答える
0

テーブルの実際のテーブル説明を提供していないためです。私の答えでWorkerは、COMPANYデータベースで a を使用しています:

私のテーブルには、あなたとWorker同様に 3 つの給与フィールドがあります。実際の説明は次のとおりです。 field1field2field3

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 で Date実際のデータ型を使用できます)。

テーブルに次のタプルがあるとします。

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 オーダー ショー、私が言ったように日付はタイプです

給与の合計がそれを超えているすべての古いワーカーを削除する必要があるとしますNNあなたの場合、TOTのしきい値のようなものです)。年配の労働者を選択するにはWorker、テーブルを同意 ( 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)  

TSalarysalary1は、 、salary2&の 3 つのコンポーネントの合計である、労働者が雇用として得る総給与ですsalary3(上記のクエリに示されているように)

各レベルでの給与の合計はいくらですか (表の各サブセットについて):

+-----+---------+---------+---------+---------+------+---------+
| 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
+-----+---------+---------+---------+---------+------+---------+     

そして、給与の合計を持つ古い労働者を選択するためのクエリを作成しました<= N

N = 1500以下は例です:(上記で計算したように、2行を選択する必要があると思います)

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)

注意: 3 番目を含めると N (= 1500) を超えることになるため、2 つだけが選択されます。

N = 2000:(上記で計算したように、2行を選択する必要があると思います)

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)

このクエリはこの例では正常に機能しますが、長いテーブルの場合は正常に機能する可能性がありますが、これが作業を完了する 1 つの方法です。

試してみる!!

また、必要に応じて外部条件の等価条件を変更することもできます (しきい値の定義について少し混乱しています。例を挙げて質問すると良いかもしれません)。

于 2013-01-27T04:30:36.720 に答える