【问题标题】:Get 5 records, sort by Username, then get more records until LIMIT 5 reached in MySQL获取 5 条记录,按用户名排序,然后获取更多记录,直到 MySQL 中达到 LIMIT 5
【发布时间】:2019-08-17 16:37:13
【问题描述】:

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

数据库:

------------- |用户 |项目 | ------------- | 1 |啊! | 3 | bbb | | 1 |抄送 | | 2 | dd | | 3 | iii | | 4 | eee | | 6 | ff | | 5 | ggg | | 1 |呵呵 | -------------

现在,我有这个查询:

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

但这给了我 5 条独特的记录,其中包含每个唯一用户的所有项目,如下所示:

-------------------- |用户 |项目 | -------------------- | 1 | aaa,ccc,hhh | | 3 | bbb,iii | | 2 | dd | | 4 | eee | | 6 | ff | --------------------

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

-------------------- |用户 |项目 | -------------------- | 1 | aaa,ccc | | 3 | bbb,iii | | 2 | dd | | 4 | eee | | 6 | ff | --------------------

这是否可以通过单个查询来完成,这样我就不必提取记录、合并然后提取更多记录?

【问题讨论】:

标签: mysql sql group-concat


【解决方案1】:

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

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 个最新结果。然后从第一个我们得到 agrupation,从另一个我们得到用户排除。我们将结果合并,然后限制结果,因为我们不知道(我们知道,但不是针对更一般的情况)我们将在第一次选择时获得的结果数量。

【讨论】:

  • 这适用于我的情况,谢谢。 - 编辑:至于我为什么需要这个,我想在一个页面上显示 5 个不同的用户项目,但我不希望用户因为提交两个或三个项目而只显示一个而受到惩罚,所以这将有助于将相似用户的项目组合在一起,同时将其限制为最近的 5 个用户提交。
【解决方案2】:

试试下面的查询

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

【讨论】:

    【解决方案3】:

    我认为您可以在子查询上使用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所在的子查询得到结果。

    【讨论】:

      猜你喜欢
      • 2018-05-12
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      相关资源
      最近更新 更多