加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

php – 根据mySQL中的COUNT()值限制GROUP BY

发布时间:2020-12-11 23:49:45 所属栏目:MySql教程 来源:网络整理
导读:我正在将事件记录到mySQL数据库中,并希望获得前3个事件用于监视目的. 我的表事件日志如下所示: +----+------------------+---------------------+| id | eventname | eventdate |+----+------------------+---------------------+| 0 | machine1.started |

我正在将事件记录到mySQL数据库中,并希望获得前3个事件用于监视目的.

我的表事件日志如下所示:

+----+------------------+---------------------+
| 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 |
+----+------------------+---------------------+

查询最终应返回以下内容,持有

>最常发生的前3个事件(基于mySQL的COUNT()函数生成的列事件计数),按事件名称分组
>只有2行,其中eventcount = 1,但仅当1位于前3个事件计数内时(因为有很多事件发生在
一次,因此会超载我的前端)

基于上表的所需结果示例:

+------------+------------------+
| eventcount |    eventname     |
+------------+------------------+
|          3 | machine1.started |
|          2 | machine1.stopped |
|          2 | cluster.alive    |
|          1 | machine0.started |
|          1 | machine2.started |
+------------+------------------+

请注意,我不需要仅返回3行,而是具有3个最高事件数量的行.

我通过搞乱下面的查询字符串进行了大量的实验,包括多个选择和可疑的CASE … WHEN条件,但是无法使其按照我需要的方式工作.

SELECT COUNT(id) AS 'eventcount',eventname
FROM eventlog
GROUP BY eventname
ORDER BY eventcount DESC;

以高效的方式获得理想结果的最佳方法是什么? 最佳答案 这是使用变量的一种方法
SQL小提琴: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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读