MySQL выбирает максимальную дату и заказы точно в дату

У меня проблема, я не могу выбрать SQL в своей базе данных. Мне нужно выбрать все элементы заказа, где во второй таблице указана максимальная дата как определенная дата. Так, например, мне нужны заказы, которые заканчиваются 2019-11-14

Таблица заказов:

order_id   driver  
---------|--------
  1      |   10  |
  2      |   10  |
  3      |   15  |
  4      |   15  |
  5      |    8  |

Таблица элементов календаря:

calendar_id     order_id        date  
-------------|------------|---------------
     1       |      1     |    2019-11-13  
     2       |      1     |    2019-11-14
     3       |      1     |    2019-11-15
     4       |      2     |    2019-11-13
     5       |      2     |    2019-11-14     // This is last date on order AND = 2019-11-14
     6       |      3     |    2019-11-16
     7       |      3     |    2019-11-17
     8       |      3     |    2019-11-18
     9       |      4     |    2019-11-13
     10      |      4     |    2019-11-14    // This is last date on order AND = 2019-11-14

Мне нужно выбрать заказы, которые заканчиваются на дату 2019-11-14, поэтому окончательный результат будет (с group by on order_id):

 order_id      date  
---------|---------------
  2      |   2019-11-14  |
  4      |   2019-11-14  |

Мой мозг разогревается

какой запрос вы пробовали? вы можете использовать max () и группировать по   —  person Dejw Roško    schedule 14.11.2019

См. также:  Группировка результатов нескольких GROUP_CONCAT() только с различными значениями
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 3
  1. Dejw Roško

    Вы можете использовать агрегирование и having:

    select order_id, max(date) date
    from calendar_items c
    group by order_id
    having max(date) = '2019-11-14'
    

    Демонстрация DB Fiddle:

    order_id | date      
    -------: | :---------
           2 | 2019-11-14
           4 | 2019-11-14
    
  2. Dejw Roško

    Аналитические функции делают эту проблему очень решаемой, и мы можем использовать здесь ROW_NUMBER, чтобы идентифицировать самые последние записи для каждого заказа:

    WITH cte AS (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY date DESC) rn
        FROM calendar_items
    )
    
    SELECT order_id, date
    FROM cte
    WHERE date = '2019-11-14' AND rn = 1;
    

    В этом ответе предполагается, что вы используете MySQL версии 8 или новее.

  3. Dejw Roško

    Это вернет order_id, дату, драйвер, упорядоченный по идентификатору заказа.

    SELECT order_id, max(date),driver from calendar INNER JOIN orders ON orders.order_id = calendar.order_id GROUP By orders.oreder_id ORDER BY orders.order_id
    
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: