С этим запросом я получаю все уведомления для последних пользователей моего сайта, которые их создали:
SELECT id,lasts.user_id FROM notifies INNER JOIN
(SELECT user_id, MAX( created_at ) as last_at
FROM `notifies`
GROUP BY user_id
ORDER BY last_at DESC
LIMIT 5) as lasts
ON notifies.user_id = lasts.user_id
Я хочу получить только последние 5 уведомлений для этого пользователя. Как я могу изменить этот запрос?
спасибо
SELECT n.*
FROM (
SELECT u.id,
COALESCE(
(
SELECT created_at
FROM notifies ni
WHERE ni.user_id = u.id
ORDER BY
user_id DESC, created_at DESC
LIMIT 5
), CAST('0001-01-01' AS DATE)) AS lt
FROM users u
) u
JOIN notifies n
ON n.user_id <= u.id
AND n.user_id >= u.id
AND n.created_at >= u.lt
Создайте индекс на notifies (user_id, created_at)
, чтобы он работал быстро.
Обратите внимание, что n.user_id <= u.id AND n.user_id >= u.id
вместо простого n.user_id = u.id
следует использовать, чтобы MySQL
эффективно использовать этот индекс.
Считывая ваш sql, я думаю, что у вас есть таблица с именем "уведомляет", как эти поля
id | user_id | created_at
И вам нужно получить последние пять записей указанного пользователя, используя поле created_at.
SELECT
id, user_id,created_at
FROM
notifies
WHERE
user_id = ?
ORDER BY
created_at DESC
LIMIT 5;
Этот SQL выбирает всю таблицу и фильтры, чтобы получить только user_id =? (где? - это идентификатор, который вы требуете), а затем упорядочивайте его с помощью create_at, начиная с верхней даты (наиболее recet), и, наконец, мы обрезаем SQL, чтобы получить только первые пять элементов этого sql.
Если я ошибаюсь в своем предположении, пожалуйста, скажите, но это то, что я думаю, вам нужно прочитать свой вопрос.
@op
хочет, чтобы последние 5
уведомлений для каждого пользователя.
Используя этот метод.
select user_id,
created_at,
last_at
from (select user_id,
created_at,
last_at,
@num := if(@group = user_id, @num + 1, 1) as row_number,
@group := user_id as dummy
from `notifies`
order by last_at desc) as x
where row_number <= 5;