更新每个用户的n条记录

时间:2012-06-07 10:53:07

标签: mysql sql

我必须为每个用户更新n个最旧的订单。现在我使用以下代码来更新每个用户最旧的1条记录,但无法弄清楚如何更新n条记录...

UPDATE orders
                INNER JOIN (
                    SELECT id, MIN(created) AS created
                    FROM orders 
                    WHERE status="queue" AND type="order"
                    GROUP BY user_id
                ) m ON orders.id = m.id
            SET orders.status = "process",
                orders.lock_id ="somehash"

我找到了anserw:

set @num := 0, @type := "";

UPDATE orders INNER JOIN(

SELECT id, user_id, created, row_number FROM (
   SELECT id, user_id, created,
      @num := if(@type = user_id, @num + 1, 1) AS row_number,
      @type := user_id AS dummy
  FROM orders
  WHERE status = "queue"
  ORDER BY user_id, created asc ) AS grouped_orders 
WHERE grouped_orders.row_number <= 2

) m ON orders.id = m.id SET orders.status = "process", orders.lock_id = "somehash";

2 个答案:

答案 0 :(得分:2)

我认为这不会令人惊讶,但如果没有ROW_NUMBER()或其他Window函数,并且没有使用循环(甚至比这更糟糕),操作会变得更复杂:

UPDATE  Orders
        INNER JOIN
        (   SELECT  o1.ID
            FROM    Orders o1
                    LEFT JOIN Orders o2
                        ON o2.User_ID = o1.User_ID
                        AND o2.CreatedDate < o1.CreatedDate
            GROUP BY o1.ID
            HAVING  COUNT(*) < 3
        ) o
            ON orders.ID = o.ID
SET     Status = 1;

在这种情况下,n3条款中的HAVING。如果每个User_ID有少量数据,这可以正常工作。如果每个查询有数千行,查询将很快变得相当缓慢和繁琐。

<强> Example on SQL Fiddle

答案 1 :(得分:1)

查看如何在查询中使用limitorder by。这些将帮助您获得每个用户的最早的记录。

然后,您必须像对待每个条目一样更新。

您可能必须使用类似于此的查询:

update table set WHAT_YOU_WANT_TO_SET
where table.id in (select id, etc from other_table USING_LIMIT_AND_ORDER_BY)