mysql - 为每个用户更新 n 条记录

标签 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"

我找到了答案:

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";

最佳答案

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

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;

本例中的 nHAVING 子句中的 3。如果每个 User_ID 的数据量较小,则此方法可以正常工作。如果每个行都有数千行,那么查询很快就会变得相当慢且麻烦。

Example on SQL Fiddle

关于mysql - 为每个用户更新 n 条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10930358/

相关文章:

c# - 使用 PHP 脚本为桌面应用程序建立 MySQL 连接

使用 GROUP BY 时 MySQL SUM 不起作用

sql - 获取休假最少天数的员工

sql - 导出和导入 Oracle 表时遇到问题

sql - PostgreSQL 在子查询中引用外部查询

php - 登录表单在实时服务器上第一次尝试失败,但在第二次或第三次尝试时有效

php - 跨 3 个表的复杂多重联接查询

php - 仅在一个 SQL 查询中检索所有类别、子类别、子子类别等的完整列表

php - 如何按热门/上升职位订购

MySQL 查询执行 SELF join 并执行聚合