Как найти следующий идентификатор заказа mysql

Пример ввода

order_id Customer_id Order_date    
1          1         2017-11-01    
2          2         2017-11-02    
3          1         2017-11-03    
4          2         2017-11-04

Желаемый результат

order_id next_order_id

1              3    
2              4    
3    
4

Что будет "next_order_id" для order_id: 3 и 4 ??? NULL или что-то еще

user8406805 14.05.2018 20:04

@KKK NULL .......

Helping Hand.. 14.05.2018 20:05

Версия MySQL, пожалуйста?

user8406805 14.05.2018 20:06
Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
3
95
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Вы можете использовать LEAD:

SELECT order_id,
 LEAD(order_id) OVER(PARTITION BY Customer_id ORDER BY Order_date) AS next_order
FROM tab
ORDER BY order_id;

Демонстрация DBFiddle - MySQL 8.0


Для предыдущей версии MySQL:

SELECT order_id,
     (SELECT order_id 
     FROM tab t2 
     WHERE t1.customer_id = t2.customer_id 
       and t2.Order_date > t1.order_date 
     ORDER BY Order_date LIMIT 1 ) AS next_order
FROM tab t1
ORDER BY order_id;

DBFiddle Demo2

Оконные функции избавляют от всего удовольствия :-(

Strawberry 14.05.2018 20:15

Вы также можете subquery:

SELECT order_id, 
       (select order_id 
        from table 
        where Customer_id = t.Customer_id and 
              Order_date > t.Order_date
        order by Order_date 
        LIMIT 1) as next_order_id
FROM table t
ORDER BY order_id;

Каноническим способом в MySQL был бы коррелированный подзапрос:

select t.*,
       (select t2.order_id
        from t t2
        where t2.customer_id = t.customer_id and t2.order_date > t.order_date
        order by t2.order_date desc
        limit 1
       ) as next_order_id
from t;

Если вы используете MySQL 8.0, lead() - лучший выбор.

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