#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