Igg*_*lob 5 php mysql sql rdbms
我正在将事件记录到mySQL数据库中,并希望获得前3个事件用于监视目的.
我的表eventlog看起来像这样:
+----+------------------+---------------------+
| id | eventname | eventdate |
+----+------------------+---------------------+
| 0 | machine1.started | 2016-09-04 19:22:23 |
| 1 | machine2.reboot | 2016-09-04 20:23:11 |
| 2 | machine1.stopped | 2016-09-04 20:24:12 |
| 3 | machine1.started | 2016-09-04 20:25:12 |
| 4 | machine1.stopped | 2016-09-04 23:23:16 |
| 5 | machine0.started | 2016-09-04 23:24:00 |
| 6 | machine1.started | 2016-09-04 23:24:16 |
| 7 | machine3.started | 2016-09-04 23:25:00 |
| 8 | machine4.started | 2016-09-04 23:26:00 |
| 9 | cluster.alive | 2016-09-04 23:30:00 |
| 10 | cluster.alive | 2016-09-05 11:30:00 |
+----+------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)
查询最终应返回以下内容,持有
eventcount由mySQL的COUNT()函数生成的列),按其分组eventnameeventcount= 1,但只有1在前3位内eventcounts(因为有很多事件只发生一次因此会使我的前端超载)基于上表的所需结果示例:
+------------+------------------+
| eventcount | eventname |
+------------+------------------+
| 3 | machine1.started |
| 2 | machine1.stopped |
| 2 | cluster.alive |
| 1 | machine0.started |
| 1 | machine2.started |
+------------+------------------+
Run Code Online (Sandbox Code Playgroud)
请注意,我不需要仅返回3行,而是需要3行最高eventcount的行.
我通过搞乱下面的查询字符串进行了大量的实验,包括多个选择和可疑CASE ... WHEN条件,但是无法使其按照我需要的方式工作.
SELECT COUNT(id) AS 'eventcount', eventname
FROM eventlog
GROUP BY eventname
ORDER BY eventcount DESC;
Run Code Online (Sandbox Code Playgroud)
以高效的方式获得理想结果的最佳方法是什么?
这是使用变量 SQL Fiddle 的一种方法:http://sqlfiddle.com/#!9 /b3458b/16
SELECT
t2.eventcount
,t2.eventname
FROM
(
SELECT
t.eventname
,t.eventcount
,@Rank:=IF(@PrevCount=t.eventcount,@Rank,@Rank+1) Rank
,@CountRownum:=IF(@PrevCount=t.eventcount,@CountRowNum + 1,1) CountRowNum
,@PrevCount:= t.eventcount
FROM
(
SELECT
l.eventname
,COUNT(*) as eventcount
FROM
eventlog l
GROUP BY
l.eventname
ORDER BY
COUNT(*) DESC
) t
CROSS JOIN (SELECT @Rank:=0, @CountRowNum:=0, @PrevCount:=-1) var
ORDER BY
t.eventcount DESC
) t2
WHERE
t2.Rank < 4
AND NOT (t2.eventcount = 1 AND t2.CountRowNum > 2)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
219 次 |
| 最近记录: |