Эффективно сохранить восходящее положение в число строк с MySQL - PullRequest
0 голосов
/ 29 марта 2012

Я ищу наиболее эффективный способ обновления числа строк, выбранных оператором where и order by, чтобы позиции от 1 до n сохранялись в этих строках. Для тех же значений в поле заказа должна быть та же самая позиция, но тогда следующие позиции должны быть пропущены.

ID, catagory_id, price, position
1,  1,           19.99, NULL
2,  2,            9.99, NULL
3,  1,            9.99, NULL
4,  1,            9.99, NULL
5,  1,            2.99, NULL

UPDATE stuff SET position=XXX WHERE category_id = 1 ORDER BY price ASC

ID, catagory_id, price, position
1,  1,           19.99, 4
2,  2,            9.99, NULL
3,  1,            9.99, 2
4,  1,            9.99, 2
5,  1,            2.99, 1

Обратите внимание, что position=2 устанавливается дважды и, следовательно, position=3 опускается.

Возможно ли это с помощью одного SQL-запроса? Я не хочу выдавать заявление об обновлении для каждой строки, поскольку миллионы мне придется обновлять ежедневно.

Без тех же позиций я использовал:

  SELECT @row:=0;
  UPDATE offers SET position = (@row:=@row+1) WHERE category_id = 1 ORDER BY price ASC;

1 Ответ

0 голосов
/ 29 марта 2012

Ваш вопрос не ясен.Как я понимаю, вы хотите заполнить столбец позиции рангом конкретной строки в данной категории.

[1] Инициализировать:

SELECT @pos:=0, @prev_price:=-1.0, @omitted:=0;

[2]Используйте этот запрос, чтобы получить требуемые номера позиций:

SELECT id, IF(price > @prev_price, @pos:=@omitted+@pos+1, @pos) AS position, IF(@prev_price = price, @omitted:=@omitted+1, @omitted:=0), @prev_price:=price FROM offers WHERE category_id = 1 ORDER BY price ASC;

[3] Теперь набор результатов можно сделать INSERT .... ON DUPLICATE KEY UPDATE

INSERT INTO offers (id, position) SELECT A.id, A.position FROM (SELECT id, IF(price > @prev_price, @pos:=@omitted+@pos+1, @pos) AS position, IF(@prev_price = price, @omitted:=@omitted+1, @omitted:=0), @prev_price:=price FROM offers WHERE category_id=1 ORDER BY price ASC) AS A ON DUPLICATE KEY UPDATE position = A.position;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...