Как обновить таблицу кумулятивным (накопленным) значением выборки?

Таблицы users (id, till) и orders (id, uid, ts)
В заказах отметка времени оплаты ts значит, что оплачен период, условно, длиной 10. Если оплаченные периоды накладываются, срок окончания, соотв. отодвигается.
создание таблиц
-- Orders
CREATE TABLE orders (
  id INT NOT NULL AUTO_INCREMENT,
  uid INT NOT NULL ,
  ts INT NOT NULL ,
  PRIMARY KEY (id)
);
-- Paid duraion = 10
-- 1: 0-10, 12-22 + 21-31 = 32
-- 2: 12-22, 22-32 + 22-32 = 42
INSERT INTO orders (uid, ts) 
VALUES (1,0), (2,12), (1,12), (1,21), (2,22), (2,22);

-- Users
CREATE TABLE users (
  id INT NOT NULL,
  till INT,
  PRIMARY KEY (id)
);
-- далеко не все пользователи делали оплаченные заказы
INSERT INTO users (id) VALUES (1), (2), (3), (4);


Как средствами MySQL обновить колонку till актуальными сроками окончания оплаченных периодов у пользователей, сделавших заказы?

Пробую так:
UPDATE users u JOIN orders o ON u.id = o.uid
SET till = (
  SELECT until FROM (
    SELECT o2.uid, o2.ts, 
      (@till := IF (@till < o2.ts, o2.ts + 10, @till + 10)) AS until,
      (@n := @n + 1) n
    FROM orders AS o2 JOIN (SELECT @till:=0, @n:=0 ) AS init
    WHERE o2.uid = u.id
  ) AS t1
  ORDER BY n DESC
  LIMIT 1
)

Ошибка: Unknown column 'u.id' in 'where clause' Т.е. из внутреннего запроса не получить текущий users.id
И неправильно JOIN с заказами я использую: так по каждому юзеру обновляться будет по несколько раз, видимо.

Как получить очередной users.id во внутреннем запросе?
  • Вопрос задан
  • 35 просмотров
Пригласить эксперта
Ответы на вопрос 1
BojackHorseman
@BojackHorseman
...в творческом отпуске...
UPDATE `users` u, (
 SELECT `uid`, SUM(`ts`) AS _sum_ts FROM `orders` GROUP BY `uid`
) AS _group_orders
SET u.`till` = u.`till` + _group_orders.`_sum_ts `
WHERE u.`id` = _group_orders.`uid`
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
18 марта 2019, в 20:32
2000 руб./за проект
18 марта 2019, в 19:35
500 руб./за проект
18 марта 2019, в 19:31
100000 руб./за проект