根据MySQL数据库中的计数和日期获取前5项

时间:2015-03-29 21:31:13

标签: php mysql sql

我希望在一个表格中获得前五项,但在一段时间内,比如7天。

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

 user_id | entry_id |   sig  |    timestamp
 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& #39;)并将其弹出到图表中。

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

任何贡献都将不胜感激。

2 个答案:

答案 0 :(得分:1)

由于每个组没有相同的时间范围(每行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

答案 1 :(得分: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;