MySQL, как сгенерировать индекс строки (ранг) в SELECT?

В результате запроса 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 вы используете?

N3SS4H 04.01.2019 23:22
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
1
447
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Стандартный способ сделать это в 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.

Да, переменные ДВА необходимы, а не одна.

Salman A 04.01.2019 23:19
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;

Другие вопросы по теме