我必须为每个用户更新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";
答案 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;
在这种情况下,n
是3
条款中的HAVING
。如果每个User_ID有少量数据,这可以正常工作。如果每个查询有数千行,查询将很快变得相当缓慢和繁琐。
<强> Example on SQL Fiddle 强>
答案 1 :(得分:1)