【发布时间】:2014-03-07 13:44:37
【问题描述】:
我无法提出一个查询,该查询将允许我只保留来自用户的最新订单(也许更好的说法是删除所有旧订单):
CREATE TABLE orders(id integer, created_at datetime, user_id integer, label nvarchar(25));
INSERT INTO orders values(1, now(), 1, 'FRED FIRST');
INSERT INTO orders values(2, DATE_ADD(now(), INTERVAL 1 DAY), 1, 'FRED SECOND');
INSERT INTO orders values(3, DATE_ADD(now(), INTERVAL 2 DAY), 1, 'FRED THIRD');
INSERT INTO orders values(4, DATE_ADD(now(), INTERVAL 1 DAY), 3, 'BARNEY FIRST');
SELECT * FROM orders;
'1','2014-03-07 08:39:36','1','FRED FIRST'
'2','2014-03-08 08:39:36','1','FRED SECOND'
'3','2014-03-09 08:39:36','1','FRED THIRD'
'4','2014-03-08 08:39:36','3','BARNEY FIRST'
我想运行一个查询,让我得到 FRED 的第三个订单和 BARNEY 的第一个订单。 FRED FIRST 和 FRED SECOND 应该被删除,因为它们不是来自 FRED 的最新订单。
有什么想法可以通过单个查询来做到这一点吗?
编辑:发布后,我发现了一些有用的东西(它可以做我想做的事情)——但看起来有点乱:
DELETE old_orders
FROM orders old_orders
left outer join(
SELECT MAX(created_at) as created_at, user_id
FROM orders
GROUP BY user_id) new_orders
ON new_orders.user_id = old_orders.user_id and new_orders.created_at = old_orders.created_at
WHERE new_orders.user_id is null;
【问题讨论】:
标签: mysql group-by sql-delete