Как найти последнего упорядоченного пользователя в mysql?

#mysql #select #group-by #subquery #sql-order-by

#mysql #выберите #группировка по #подзапрос #sql-order-by

Вопрос:

У меня есть 2 таблицы «пользователи» и «заказы».

Пользователи:

 userid   apartment_id   blockid  flat_id
1002             2           3       101
1004             1           4       102 
1005             2           3       101
  

Заказы:

 orderid   userid   order_date
10         1002    2020-07-11
11         1004    2020-08-13  
12         1005    2020-09-11
  

Теперь я хочу следующее:

 apartment_id    blockid    flat_id   no_of_users  last_order_date   last_order_user_id
    2              3         101        2            2020-09-11          1005
  

Я написал SQL для поиска всего этого, за исключением «last_order_user_id». Может кто-нибудь, пожалуйста, помочь мне с этим? Это то, что у меня есть до сих пор:

 SELECT apartment_id,blockid,flat_id,COUNT(DISTINCT u.userid) AS users,MAX(o.order_date) AS Last_order_on FROM users u LEFT JOIN orders o ON u.user_id=o.user_id GROUP BY apartment_id,blockid,flat_no;
  

Я попытался добавить o.userid в список полей в инструкции select, но поскольку таблица orders упорядочена по order_date в порядке возрастания, она возвращает первый заказанный идентификатор пользователя.

Любые предложения были бы очень полезны.

Ответ №1:

Вам нужно определить максимальную дату заказа для каждой комбинации квартира / блок / квартира; затем вы можете присоединить это обратно к таблицам заказы и пользователи, чтобы найти пользователя, который сделал последний заказ:

 SELECT u.apartment_id, u.blockid, u.flat_id,
       m.no_of_users,       
       m.last_order_date,
       u.user_id AS last_order_user_id
FROM users u 
JOIN orders o ON u.user_id = o.user_id
JOIN (
  SELECT apartment_id, blockid, flat_id,
         COUNT(DISTINCT u.user_id) AS no_of_users,
         MAX(o.order_date) AS last_order_date
  FROM users u
  JOIN orders o ON u.user_id = o.user_id
  GROUP BY apartment_id, blockid, flat_id
) m ON m.apartment_id = u.apartment_id
   AND m.blockid = u.blockid
   AND m.flat_id = u.flat_id
   AND m.last_order_date = o.order_date
  

Вывод:

 apartment_id    blockid     flat_id     no_of_users     last_order_date     last_order_user_id
1               4           102         1               2020-08-13          1004
2               3           101         2               2020-09-11          1005
  

Демонстрация на SQLFiddle