获取5条记录,按用户名排序,然后获取更多记录,直到MySQL中达到限制5为止

获取5条记录,按用户名排序,然后获取更多记录,直到MySQL中达到限制5为止,mysql,sql,group-concat,Mysql,Sql,Group Concat,我试图从MySQL数据库中提取5条最新记录,然后按用户将它们分组,然后在分组后,获取更多记录,直到有5条按日期排序的唯一用户。理想情况下,我希望通过一个查询来实现这一点 数据库: ------------- | user | item | ------------- | 1 | aaa | | 3 | bbb | | 1 | ccc | | 2 | ddd | | 3 | iii | | 4 | eee | | 6 | fff | |

我试图从MySQL数据库中提取5条最新记录,然后按用户将它们分组,然后在分组后,获取更多记录,直到有5条按日期排序的唯一用户。理想情况下,我希望通过一个查询来实现这一点

数据库:

------------- | user | item | ------------- | 1 | aaa | | 3 | bbb | | 1 | ccc | | 2 | ddd | | 3 | iii | | 4 | eee | | 6 | fff | | 5 | ggg | | 1 | hhh | ------------- 但这给了我5个唯一的记录,每个唯一的用户都有所有项目,如下所示:

-------------------- | user | items | -------------------- | 1 | aaa,ccc,hhh | | 3 | bbb,iii | | 2 | ddd | | 4 | eee | | 6 | fff | -------------------- -------------------- | user | items | -------------------- | 1 | aaa,ccc | | 3 | bbb,iii | | 2 | ddd | | 4 | eee | | 6 | fff | -------------------- -------------------- |用户|项| -------------------- |1 | aaa、ccc、hhh| |3 | bbb,iii| |2 | ddd| |4 | eee| |6 | fff| -------------------- 在上一个示例中,用户1不应该有项目“hhh”,因为在该记录之前有7条记录,其中有5个唯一用户。相反,我希望它拉取前5条记录(结束于USER 3 iii),然后将USER 1和USER 3重复记录分组,然后再获得两条记录以达到限制5,如下所示:

-------------------- | user | items | -------------------- | 1 | aaa,ccc,hhh | | 3 | bbb,iii | | 2 | ddd | | 4 | eee | | 6 | fff | -------------------- -------------------- | user | items | -------------------- | 1 | aaa,ccc | | 3 | bbb,iii | | 2 | ddd | | 4 | eee | | 6 | fff | -------------------- -------------------- |用户|项| -------------------- |1 | aaa,ccc| |3 | bbb,iii| |2 | ddd| |4 | eee| |6 | fff| --------------------
这是否可以通过单个查询实现,这样我就不必提取记录、合并,然后再提取更多记录?

我真的不明白为什么您需要这种奇怪的选择,但这至少可以帮助您从以下方面开始:

SELECT u.user, u.item FROM
(SELECT db.user, group_concat(db.item) as item
FROM ( 
    SELECT user, item 
    FROM database  
    ORDER BY date DESC 
    LIMIT 5 
) db
UNION
SELECT user, item
FROM database 
WHERE user not in ( 
    SELECT user
    FROM database  
    ORDER BY date DESC 
    LIMIT 5 
) db
ORDER BY date DESC
limit 5) u
LIMIT 5;

两个子选择都得到5个最新结果。然后从第一个得到agruption,从另一个得到要排除的用户。我们合并结果,然后限制结果,因为我们不知道(我们知道,但在更一般的情况下不知道)第一次选择将得到的结果量。

我认为您可以在子查询上使用
row\u number()over(按用户划分)作为user\u occurrence\u num
,它将为您提供:

 --------------------------------
| user | item |user_occurence_num|
|------|------|------------------|
|    1 |  aaa |1                 |
|      |      |                  |    
|    3 |  bbb |1                 |
|      |      |                  |
|    1 |  ccc |2                 |   
|    2 |  ddd |1                 |    
|    3 |  iii |2                 |  
|    4 |  eee |1                 |
|      |      |                  |
|    6 |  fff |1                 | 
|      |      |                  |
|    5 |  ggg |1                 |
|      |      |                  |
|    1 |  hhh |3                 |   
 ---------------------------------
然后在
user\u occurrence\u num=1 LIMIT 5
处筛选子查询以获得结果。

尝试下面的查询

SELECT a.user , GROUP_CONCAT(a.item)
FROM ( select user , item from database 
GROUP BY user
ORDER BY date DESC LIMIT 5 ) as a;

在什么意义上,一个记录是在另一个记录之前?请看,数据集中没有日期。这对我的情况有效,谢谢编辑:至于我为什么需要这个,我想在一个页面上显示5个不同用户的项目,但我不希望用户因为提交两个或三个项目而只显示一个项目而受到惩罚,因此这将有助于将类似用户的项目组合在一起,同时将其限制在最近5个用户提交的项目内。