GROUP BY中的ORDER BY和LIMIT

Rob*_*Rob 4 mysql sql group-by limit greatest-n-per-group

我想在GROUP BY中获取一些记录子集,我已经看到了很多疯狂的解决方案,但它们看起来太复杂了,有没有更有效的方法来做到这一点.

SELECT user_id, GROUP_CONCAT(item_id ORDER BY `timestamp`) AS items 
FROM wb_user_book_current_item GROUP BY user_id
Run Code Online (Sandbox Code Playgroud)

所以这将返回给我所有用户的所有当前项目,这是目前为止还可以.但我只想要十件最新的东西.添加ORDER BYGROUP_CONCAT帮助,但它仍然没有给我最后十条记录.

编辑

如果我做这样的事情和硬编码user_id然后我可以得到我想要的那个用户的结果,问题是结合它,所以我不需要硬编码,user_id并且可以例如只是让所有用户最后十个项目

SELECT GROUP_CONCAT(cp2.item_id) AS items 
FROM (SELECT cp.user_id, cp.item_id 
      FROM wb_user_book_current_item cp 
      WHERE cp.user_id=1 ORDER BY cp.`timestamp` 
      LIMIT 10) AS cp2 
GROUP BY cp2.user_id
Run Code Online (Sandbox Code Playgroud)

lc.*_*lc. 5

这是一个难题,但是这个怎么样:

SELECT user_id, GROUP_CONCAT(item_id ORDER BY `timestamp`) AS items
FROM wb_user_book_current_item T
WHERE NOT EXISTS
(
    SELECT 1
    FROM wb_user_book_current_item T2
    WHERE T2.user_id = T.user_id
    ORDER BY T2.`timestamp` DESC
    LIMIT 10,1
) 
OR T.`timestamp` > (
    SELECT T2.`timestamp`
    FROM wb_user_book_current_item T2
    WHERE T2.user_id = T.user_id
    ORDER BY T2.`timestamp` DESC
    LIMIT 10,1
)
GROUP BY user_id
Run Code Online (Sandbox Code Playgroud)

当然,这假设您不会timestamp为同一用户提供两行相同的行.

如果您的时间戳字段始终是一个正整数,也可以替换NOT EXISTS...OR使用COALESCE:

SELECT user_id, GROUP_CONCAT(item_id ORDER BY `timestamp`) AS items
FROM wb_user_book_current_item T
WHERE T.`timestamp` > COALESCE((
    SELECT T2.`timestamp`
    FROM wb_user_book_current_item T2
    WHERE T2.user_id = T.user_id
    ORDER BY T2.`timestamp` DESC
    LIMIT 10,1
), 0)
GROUP BY user_id
Run Code Online (Sandbox Code Playgroud)

原始答案,但显然MySQL不明白如何正确地做这个并抱怨subselect返回多行.当然我们想要多行; 这是一个GROUP_CONCAT.格儿.

不幸的是,我认为使用子查询没有真正的方法:

SELECT T.user_id, 
    GROUP_CONCAT((SELECT T2.item_id 
                  FROM wb_user_book_current_item T2 
                  WHERE T2.user_id = T.user_id 
                  ORDER BY T2.`timestamp` 
                  LIMIT 10)) AS items 
FROM wb_user_book_current_item T
GROUP BY user_id
Run Code Online (Sandbox Code Playgroud)

否则,LIMIT在其他任何地方添加将限制组的数量,或限制表中的总记录集(而不是组) - 这两者都不是您要实现的目标.