【问题标题】:Get the top 5 items based on count and date in MySQL database根据 MySQL 数据库中的计数和日期获取前 5 项
【发布时间】:2015-03-29 21:31:13
【问题描述】:

我希望在某个时间段内(例如 7 天)获得表格中的前 5 个项目。

这是表结构和一些随机示例数据

用户 ID | entry_id |签名 |时间戳 1 1 8846 2015-03-27 20:49:56 1 2 8846 2015-03-27 20:49:56 1 3 8846 2015-03-27 20:49:56 1 4 4544 2015-03-27 20:49:56 1 5 4544 2015-03-27 20:49:56 1 6 65445 2015-03-27 20:49:56

User_id 是唯一的,entry_id 是主键。

例如,我想查询 sig 列来计算每个数字在 7 天的时间段内出现的次数,例如 8846 出现 20 次。

这是我到目前为止的 SQL 查询,它计算出现次数但不在一段时间内。目前它的基础只需要一个工作示例。

SELECT sig, count(sig), sig_count FROM event 
GROUP BY sig
ORDER BY sig_count
DESC LIMIT 5;

(编辑)其他详细信息
我之前错误地表达了这个问题。我真正想说的是,我需要根据过去 7 天的某个时间段内的事件获得前 5 个 sigs 并返回这些记录。数据将用于填充排序图。

例如,如果我可以得到结果然后使用 PHP,我可以获取 entry_id 并循环通过它来获取时间戳和出现次数(频率“x”时间“y”)并将其弹出到图形。

我猜第一个查询会得到计数结果。然后可以运行第二个查询以获取该特定 sig id 以及过去 7 天内与之关联的所有记录。

任何贡献都将不胜感激。

【问题讨论】:

  • 7 天内什么?

标签: php mysql sql


【解决方案1】:

据我了解,这是一个带有 where 子句的聚合:

select sig, count(*) as sig_count
from table t
where timestamp >= date_sub(now(), interval 7 day)
group by sig
order by sig_count desc
limit 5;

【讨论】:

  • 这非常适合计数,谢谢。我修改了问题。返回所有记录是否足够简单。我需要为一个图表创建一个数据集,该数据集在 7 天期间内将有一个 y 轴和每天的 x 轴。谢谢。
【解决方案2】:

由于每个组的时间范围不同(每行 7 天内不同),您必须使用子查询来获取每行 7 天内的计数,这会很慢,但我不会确定还有其他方法。

select sig, max(sig_count)
from (
    select sig,
        (select count(*) from event e2
        where e2.sig = e1.sig
        and e2.timestamp between date_sub(e1.timestamp,interval 7 day)
            and date_add(e1.timestamp,interval 7 day)) as sig_count
    from event e1
) t1 group by sig
order by max(sig_count) desc
limit 5

【讨论】:

  • 我确实有一条评论说它不起作用,但似乎已经消失了。我一定是打错了。我现在运行查询。到目前为止已经一分钟了,而且还在继续。我有大约 30000 条记录。 :p
  • 对提高速度有什么建议吗?记录数可能在一两个月内达到数十万。感谢您的帮助。
  • @rkleman12 我会将 7 天的计数保存到数据库中,并在每次插入新事件时更新它们
  • @rkleman12 在(sig,timestamp) 上的综合索引也会有所帮助
  • 感谢您的建议。我会试试看是否有帮助。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
相关资源
最近更新 更多