2017-07-16 105 views
1

我想删除依赖于日期列的行,我希望能够删除指定日期之间的行,所以我总是保留最早的行和最新的行并删除中间一行。我目前使用此代码MySQL |从中间的日期范围中删除行

...

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

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

enter image description here

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

回答

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); 

它看起来额外的,因为比较复杂,在子查询中加入。但是这允许子查询在聚合之前进行过滤。

+0

这工作,但我仍然结束了3行而不是只有两个? – tallent123

+0

这是我的错,我在删除语句后插入了!这工作的魅力,谢谢!] – tallent123