1

次のように MyTable という名前の MySQL テーブルにいくつかのデータを格納しています。

+----------+-----------+---------------------+
|    my_id |    amount | updated             |
+----------+-----------+---------------------+
|   105415 |        81 | 2013-02-13 00:00:00 |
|   105414 |        33 | 2013-02-13 00:00:00 |
|   220801 |       240 | 2013-02-13 00:00:00 |
|   105411 |       118 | 2013-02-13 00:00:00 |
|   105411 |       118 | 2013-02-12 00:00:00 |
|   220801 |       240 | 2013-02-12 00:00:00 |
|   105414 |        33 | 2013-02-11 00:00:00 |
|   105415 |        81 | 2013-02-11 00:00:00 |
+----------+-----------+---------------------+

私がしたいことは、今日 (2013-02-13) と同じ my_id と amount を持つ昨日 (2013-02-12) のすべての行を削除することです。

今日からすべてのデータを選択する方法を知っています:

SELECT * FROM 'MyTable' WHERE 'updated' = CURDATE()

昨日からすべてのデータを選択する方法を知っています:

SELECT * FROM 'MyTable' WHERE 'updated' = CURDATE()-1

DELETE コマンド ( ) の構文を知っていますDELETE FROM 'MyTable' WHERE...

my_id と amount が昨日と今日で一致する行を削除するにはどうすればよいですか?

与えられた例では、これらの行を削除したいと思います:

|   105411 |       118 | 2013-02-12 00:00:00 |
|   220801 |       240 | 2013-02-12 00:00:00 |

そして、これらの行を保持したいと思います:

+----------+-----------+---------------------+
|    my_id |    amount | updated             |
+----------+-----------+---------------------+
|   105415 |        81 | 2013-02-13 00:00:00 |
|   105414 |        33 | 2013-02-13 00:00:00 |
|   220801 |       240 | 2013-02-13 00:00:00 |
|   105411 |       118 | 2013-02-13 00:00:00 |


|   105414 |        33 | 2013-02-11 00:00:00 |
|   105415 |        81 | 2013-02-11 00:00:00 |
+----------+-----------+---------------------+
4

2 に答える 2

2

@sgeddes の回答から少し変更しました。これはあなたの回答に対してもう少し正確だと思います。

とにかく、@ sgeddesの答えがこれに導かれたので、正しい答えとしてクレジットを与えてください:

DELETE t1 FROM MyTable AS t1, MyTable as t2
WHERE t1.updated = CURDATE()-1
  AND t2.updated =  CURDATE()
  AND t2.my_id = t1.my_id
  And t2.amount = t1.amount;

主キーがある場合は、これも使用できます (これは私の好みの SQL です)。

DELETE FROM MyTable 
WHERE  updated = CURDATE()-1 
  AND (my_id,amount) in (select my_id,amount 
                         from MyTable
                         where updated = CURDATE());
于 2013-02-13T14:36:43.217 に答える
1

このようなものが動作するはずです:

DELETE M
FROM MyTable M
    INNER JOIN MyTable M2 ON
        M.My_Id = M2.My_Id AND  
        M.amount = M2.amount AND  
        M2.Updated = DATE_ADD(M.Updated, INTERVAL 1 DAY)

上記のサンプル データで更新された Fiddle は次のとおりです: http://sqlfiddle.com/#!2/5e288/1

そして、削除後の結果:

MY_ID   AMOUNT  UPDATED
105415  81      February, 13 2013 00:00:00+0000
105414  33      February, 13 2013 00:00:00+0000
220801  240     February, 13 2013 00:00:00+0000
105411  118     February, 13 2013 00:00:00+0000
105414  33      February, 11 2013 00:00:00+0000
105415  81      February, 11 2013 00:00:00+0000

幸運を。

于 2013-02-13T13:36:54.420 に答える