【问题标题】:Deleting records based on a group by in MYSQL在MYSQL中根据group by删除记录
【发布时间】: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


    【解决方案1】:

    使用嵌套查询,如下所示:

    DELETE FROM orders
    WHERE id NOT IN (
      SELECT id FROM (
        select id from orders o JOIN (
          select user_id, max(created_at) t from orders group by user_id
        ) o1 ON o.user_id = o1.user_id AND o.created_at = o1.t
      ) AS tmp
    )
    

    工作小提琴:http://sqlfiddle.com/#!2/56d913/1

    【讨论】:

    • 非常感谢 - 任何想法与我提出的解决方案相比如何?查看我的编辑...
    • @ek_ny 欢迎您。两个查询在最里面部分是相同的,其中使用 MAX 并将结果与​​原始表连接以获取 MAX 行的 id。在外部,我使用了 NOT IN,而您使用了 LEFT JOIN。如果你问的是性能,那我无法回答。最好为这两个查询执行 EXPLAIN 语句并读取输出。
    【解决方案2】:

    实现此目的的一种方法是为该行设置一个标志,表明它是最近的订单。因此,当下一个新订单时,您将清除该客户的其他订单上的标志,并为您插入的行设置标志。然后您的 DELETE 查询可以删除所有没有设置该标志的订单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 2014-11-18
      • 1970-01-01
      • 2010-12-11
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多