获取5条记录,按用户名排序,然后获取更多记录,直到在MySQL中达到LIMIT 5

问题描述 投票:0回答:3

我试图从MySQL数据库中提取最近的5条记录,然后由USER将它们组合在一起,然后在它们被分组后,获得更多记录,直到我按日期排序5个唯一的USER。理想情况下,我想用一个查询来做这件事。

数据库:

 -------------
| user | item |
 -------------
|    1 |  aaa |
|    3 |  bbb |
|    1 |  ccc |
|    2 |  ddd |
|    3 |  iii |
|    4 |  eee |
|    6 |  fff |
|    5 |  ggg |
|    1 |  hhh |
 -------------

现在,我有这个问题:

SELECT user,GROUP_CONCAT(item)
FROM database
GROUP BY user
ORDER BY date DESC
LIMIT 5

但这为我提供了5个唯一记录,每个唯一的USER包含所有项目,如下所示:

 --------------------
| user |       items |
 --------------------
|    1 | aaa,ccc,hhh |
|    3 |     bbb,iii |
|    2 |         ddd |
|    4 |         eee |
|    6 |         fff |
 --------------------

在前面的示例中,用户1不应该具有项目“hhh”,因为在该记录之前有7个记录具有5个唯一的USER。相反,我希望它拉出前5个记录(结束于USER 3 iii),然后将用户1和用户3重复记录分组,然后再获得两个记录以达到LIMIT 5,如下所示:

 --------------------
| user |       items |
 --------------------
|    1 |     aaa,ccc |
|    3 |     bbb,iii |
|    2 |         ddd |
|    4 |         eee |
|    6 |         fff |
 --------------------

这可能与单个查询有关,所以我不必拉记录,合并,然后拉更多记录?

mysql sql group-concat
3个回答
0
投票

我真的不明白为什么你需要这种奇怪的选择,但这可能会帮助你至少开始:

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;

两个subselect都获得了5个最新结果。然后从第一个我们获得agrupation,从另一个我们得到用户排除。我们将结果结合起来然后限制结果,因为我们不知道(我们这样做,但不是更一般的情况)我们将在第一个选择上获得的结果量。


0
投票

请尝试以下查询

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

-1
投票

我想你可以在子查询上使用row_number() over(partition_by user) AS user_occurence_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_occurence_num = 1 LIMIT 5的子查询以获得结果。

© www.soinside.com 2019 - 2024. All rights reserved.