Запрос SQL с выборкой уникальных значений по дате и времени создания
Есть таблица
users_com
------------
id | user_id | create_datetime
1 102765 2020-01-28 9:05:11
2 102765 2020-01-28 10:05:22
3 102765 2020-01-28 11:05:55
4 104566 2020-01-28 9:05:44
5 104566 2020-01-28 12:05:52
6 104566 2020-01-28 14:05:34
Нужен запрос результатом которого станет:
users_com.id | users_com.user_id
3 102765
6 104566
На сервере с MySQL 5.6 конструкция ниже отрабатывает правильно, на другом MySQL 5.7.26 не работает. Я так понимаю какой-то отвечает параметр за это? Можете подсказать куда копать? Спасибо.
SELECT * FROM (
SELECT `id` as i, `user_id` as u, `create_datetime` as d FROM `users_com`
ORDER BY d DESC
) AS one
WHERE u IN (102765, 104566)
GROUP BY u
Ответы (1 шт):
Автор решения: Akina
→ Ссылка
SELECT MAX(id) id, user_id
FROM users_com
-- WHERE user_id IN (102765, 104566)
GROUP BY users_com
Если порядок id может не соответствовать порядку create_datetime, то
SELECT DISTINCT
FIRST_VALUE(id) OVER (PARTITION BY user_id
ORDER BY create_datetime DESC) id,
user_id
FROM users_com
-- WHERE user_id IN (102765, 104566)
То же для версии 5+
SELECT t1.id, t1.user_id
FROM users_com t1
NATURAL JOIN ( SELECT t2.user_id, MAX(t2.create_datetime) create_datetime
FROM users_com t2
-- WHERE user_id IN (102765, 104566
GROUP BY t2.user_id ) t3
-- WHERE user_id IN (102765, 104566)
PS. Надеюсь, для одного и того же user_id значения create_datetime не дублируются?
create_datetimeмогут дублироваться
Тогда для заявленной версии сервера 5.7.26
SELECT MAX(t1.id) id, t1.user_id
FROM users_com t1
NATURAL JOIN ( SELECT t2.user_id, MAX(t2.create_datetime) create_datetime
FROM users_com t2
-- WHERE user_id IN (102765, 104566
GROUP BY t2.user_id ) t3
-- WHERE user_id IN (102765, 104566)
GROUP BY t1.user_id