В результате запроса mysql у меня есть эта таблица:
orders | customer |
1 | A |
1 | A |
1 | B |
1 | B |
1 | B |
Используя только mysql, мне нужно создать столбец с порядком появления индекса для каждого клиента, чтобы получить эту таблицу:
orders | customer | index
1 | A | 1
1 | A | 2
1 | B | 1
1 | B | 2
1 | B | 3
Я пытаюсь использовать это:
set @i=1;
while @i<99999 do
select
count(order_id) as 'orders',
customer_id as 'customer',
@i as 'index'
from
orders
set @i= @i+1;
end while;
Но я получаю сообщение об ошибке. Извините, я больше не знаю, как это сделать. Любая идея будет оценена по достоинству.






Стандартный способ сделать это в MySQL 8.0 - использовать оконную функцию:
SELECT orders, customer,
ROW_NUMBER() OVER (PARTITION BY customer) AS `index`
FROM orders
До MySQL 8.0 можно было проделывать трюки со встроенными пользовательскими переменными.
SET @i = 0, @c = '';
SELECT
orders,
IF(@c=customer, @i:=@i+1, @i:=1) AS `index`,
@c:=customer AS customer
FROM orders
ORDER BY customer;
К сожалению, для этого необходимо, чтобы столбец customer располагался после столбца index.
Да, переменные ДВА необходимы, а не одна.
SELECT
orders.* ,
customerOrderCount ,
IF(@i > 1, @i:= @i - 1, @i:=customerOrdercount) AS orderIndex
FROM (SELECT * FROM orders ORDER BY customer ASC ) AS orders
JOIN (SELECT customer, count(*) AS customerOrderCount FROM orders GROUP BY
customer) counts USING (customer)
ORDER BY customer ASC, orderIndex;
какую версию MySQL вы используете?