MySQL |从中间的日期范围中删除行

时间:2017-07-16 19:11:19

标签: mysql pdo

我正在尝试删除依赖于日期列的行,我希望能够删除指定日期之间的行,因此我始终拥有最旧的行和最新的行以及中间行删除。

我目前正在使用此代码...

DELETE t FROM tracking t INNER JOIN users u ON u.id = t.uid WHERE u.name = :name 

这将删除单行,这是最早的行。不知何故,我需要删除2行中间的行,日期也在不同的行中。

enter image description here

该图像显示了当前表格的布局方式。突出显示的行是我想要删除的行。

1 个答案:

答案 0 :(得分:2)

这是一种方法:

DELETE t
    FROM tracking t INNER JOIN
         users u
         ON u.id = t.uid INNER JOIN
         (SELECT t.uid, MIN(tracked_date) as mintd, MAX(tracked_date) as maxtd
          FROM tracking t
          GROUP BY t.uid
         ) tt
         ON t.uid = tt.uid
    WHERE u.name = :name AND
          t.tracked_date NOT IN (tt.mintd, tt.maxtd);

以下版本可能具有更好的性能:

DELETE t
    FROM tracking t INNER JOIN
         users u
         ON u.id = t.uid INNER JOIN
         (SELECT t.uid, MIN(tracked_date) as mintd, MAX(tracked_date) as maxtd
          FROM tracking t INNER JOIN
               users u
               ON u.id = t.uid
          WHERE u.name = :name
          GROUP BY t.uid
         ) tt
         ON t.uid = tt.uid
    WHERE u.name = :name AND
          t.tracked_date NOT IN (tt.mintd, tt.maxtd);

由于子查询中的额外连接,它看起来更复杂。但这允许子查询在聚合之前进行过滤。