Создайте запрос для получения последних 5 строк для каждого пользователя

0

С этим запросом я получаю все уведомления для последних пользователей моего сайта, которые их создали:

    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 уведомлений для этого пользователя. Как я могу изменить этот запрос?

спасибо

  • 1
    хочешь получить первым или последним? вопрос и описание не совпадают
  • 0
    Точно упомяните, что вы хотите, ПЕРВЫЙ или ПОСЛЕДНИЙ
Теги:
select

3 ответа

1
Лучший ответ
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 эффективно использовать этот индекс.

0

Считывая ваш 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.

Если я ошибаюсь в своем предположении, пожалуйста, скажите, но это то, что я думаю, вам нужно прочитать свой вопрос.

  • 0
    Это будет выбирать только уведомления для одного пользователя, в то время как @op хочет, чтобы последние 5 уведомлений для каждого пользователя.
0

Используя этот метод.

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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню