2

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

最新の5行だけを保持したい。

を使用せずに古い行を削除できますSELECTか?

ロジックは次のようにする必要があると思います。

DELETE FROM tbl WHERE row_num > 5 ORDER BY TIME

SELECT値のリストを取得するために使用するMySQLでこれを実装するにはどうすればTIMEよいですか?

4

4 に答える 4

3

適切な節がない場合、SQL 結果セットはunorderedORDER BYと見なされる必要があります。

行のシーケンス番号を明示的に格納するには、列を提供する必要があります。これは、テーブルのタイム スタンプまたは auto_increment 列である可能性があります。

テーブルにも同時にアクセスできることに注意してください。あなたが削除している間に他の誰かが挿入している場合、どのような動作が予想されますか? 私が知る限り、これは「最新の 5 行」+「他のトランザクションで挿入された行」のみを保持する状況につながる可能性があります。


timeテーブルにその目的の列とPRIMARY KEY(または他のUNIQUE NOT NULL列) がある場合は、次のように記述できます。

DELETE tbl FROM tbl LEFT JOIN (SELECT * FROM tbl ORDER BY tm DESC LIMIT 5) AS k
    ON (tbl.pk) = (k.pk)
    WHERE k.`time` IS NULL;

複合主キーがある場合は、次の(a,b)ように記述できます。

DELETE tbl FROM tbl LEFT JOIN (SELECT * FROM tbl ORDER BY tm DESC LIMIT 5) AS k
    ON (tbl.a,tbl.b) = (k.a,k.b)
    WHERE k.tm IS NULL;
于 2013-08-07T07:37:31.557 に答える
0
DELETE FROM TBL
  WHERE ROW_NUM = (SELECT ROW_NUM FROM TBL LIMIT 6, 99999)
  ORDER BY TIME DESC; 

これにより、6、7、8、9、10、.....、200005 からレコードが削除されます

ここでLIMIT範囲が 6 ~ 9999 レコードから始まるため、200005 を意味します。

于 2013-08-07T07:28:07.453 に答える
0

多分これは代替案になるでしょう:

DELETE FROM tbl 
WHERE  primary_key NOT IN (SELECT primary_key 
                           FROM tbl 
                           ORDER BY time
                           DESC LIMIT 5)
于 2013-08-07T09:50:43.227 に答える