2012-06-07 3 views
0

Мне нужно обновить n самых старых заказов на каждого пользователя. На данный момент я использую следующий код для обновления 1 старейшей записи для каждого пользователя, но не может понять, как обновить п записи ...UPDATE 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"; 

ответ

1

проверить, как используйте limit и order by в вашем запросе. Это поможет вам получить n самых старых записей для каждого пользователя.

Затем вам нужно будет обновить, как и для каждой из этих записей, как и для одного.

Вы, возможно, придется использовать запрос, похожее на это:

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

предел не поможет здесь – user606521

2

Я не думаю, что это будет работать удивительно, но без 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; 

n в этом случае находится в HAVING статье рассматривается 3. Это отлично работает, если у вас есть небольшой объем данных для User_ID. ЕСЛИ у вас есть тысячи строк для каждого запроса, скоро станет довольно медленным и громоздким.

Example on SQL Fiddle