我正在尝试删除依赖于日期列的行,我希望能够删除指定日期之间的行,因此我始终拥有最旧的行和最新的行以及中间行删除。
我目前正在使用此代码...
DELETE t FROM tracking t INNER JOIN users u ON u.id = t.uid WHERE u.name = :name
这将删除单行,这是最早的行。不知何故,我需要删除2行中间的行,日期也在不同的行中。
该图像显示了当前表格的布局方式。突出显示的行是我想要删除的行。
答案 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);
由于子查询中的额外连接,它看起来更复杂。但这允许子查询在聚合之前进行过滤。