创建一个查询,为每个用户获取持续5行

时间:2011-01-18 11:02:02

标签: mysql select

通过此查询,我获得了创建它们的网站持续用户的所有通知:

    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通知这些用户。 我该如何修改此查询?

感谢

3 个答案:

答案 0 :(得分: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有效使用此索引。

答案 1 :(得分:0)

使用this technique

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;

答案 2 :(得分: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 =? (其中?是你需要的id),然后按创建日期从最高日期(最大的时间点)开始对它进行排序,最后我们裁剪SQL只得到这个sql的前五个元素。

如果我的假设出错了,请告诉我,但这就是我认为你需要阅读你的问题。