这里有一个方法:
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);
它看起来额外的,因为比较复杂,在子查询中加入。但是这允许子查询在聚合之前进行过滤。
这工作,但我仍然结束了3行而不是只有两个? – tallent123
这是我的错,我在删除语句后插入了!这工作的魅力,谢谢!] – tallent123