博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql实现rownum
阅读量:5142 次
发布时间:2019-06-13

本文共 4429 字,大约阅读时间需要 14 分钟。

 
CREATE 
TABLE `total_freq_ctrl` (  
  1.   `time` int(10) unsigned NOT NULL,  
  2.   `machine` char(64) NOT NULL,  
  3.   `module` char(32) NOT NULL,  
  4.   `total_flow` int(10) unsigned NOT NULL,  
  5.   `deny_flow` int(10) unsigned NOT NULL,  
  6.   PRIMARY KEY (`module`,`machine`,`time`)  
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8  

 

原sql 

 
 
  1. SELECT machine, deny_flow, total_flow, time FROM total_freq_ctrl A WHERE 1 > (SELECT COUNT(machine) FROM total_freq_ctrl WHERE machine = A.machine AND time > A.time) AND A.module = 'all' ORDER BY A.time desc;  

只要将 1 改成N就变成取每组的前N条,因为我极其不喜欢子查询,就改就尝试改称join 的方式。

 

不过这里需要对所有数据进行排序才能确定每组的前N条,所以最佳优化也要全表扫描一次。

首先我要对表中数据进行排序,引入一个变量@row来做rownumber

  

 
  1. set @row=0;set @mid='';SELECT module, machine, time, @row:=@row+1 rownum FROM total_freq_ctrl order by module,machine,time desc limit 10;   
  2. Query OK, 0 rows affected (0.00 sec)  
  3.   
  4. Query OK, 0 rows affected (0.00 sec)  
  5.   
  6. +--------+---------------+------------+--------+  
  7. | module | machine       | time       | rownum |  
  8. +--------+---------------+------------+--------+  
  9. all    | 10.201.20.181 | 1409640060 |      1 |  
  10. all    | 10.201.20.181 | 1409640000 |      2 |  
  11. all    | 10.201.20.181 | 1409639940 |      3 |  
  12. all    | 10.201.20.181 | 1409639880 |      4 |  
  13. all    | 10.201.20.97  | 1409640060 |      5 |  
  14. all    | 10.201.20.97  | 1409640000 |      6 |  
  15. all    | 10.201.20.97  | 1409639940 |      7 |  
  16. all    | 10.201.20.97  | 1409639880 |      8 |  
  17. all    | 10.201.20.98  | 1409640060 |      9 |  
  18. all    | 10.201.20.98  | 1409640000 |     10 |  
  19. +--------+---------------+------------+--------+  

rownumber已经出来了,再加一个@mid来进行分组

 

 
  1. set @row=0;set @mid='';SELECT module, machine, time,case when @mid = machine then @row:=@row+1 else @row:=1 end rownum, @mid:=machine FROM total_freq_ctrl order by module,machine,time desc limit 20;  
  2. Query OK, 0 rows affected (0.00 sec)  
  3.   
  4. Query OK, 0 rows affected (0.00 sec)  
  5.   
  6. +--------+---------------+------------+--------+---------------+  
  7. | module | machine       | time       | rownum | @mid:=machine |  
  8. +--------+---------------+------------+--------+---------------+  
  9. all    | 10.201.20.181 | 1409640180 |      1 | 10.201.20.181 |  
  10. all    | 10.201.20.181 | 1409640120 |      2 | 10.201.20.181 |  
  11. all    | 10.201.20.181 | 1409640060 |      3 | 10.201.20.181 |  
  12. all    | 10.201.20.181 | 1409640000 |      4 | 10.201.20.181 |  
  13. all    | 10.201.20.181 | 1409639940 |      5 | 10.201.20.181 |  
  14. all    | 10.201.20.181 | 1409639880 |      6 | 10.201.20.181 |  
  15. all    | 10.201.20.97  | 1409640180 |      1 | 10.201.20.97  |  
  16. all    | 10.201.20.97  | 1409640120 |      2 | 10.201.20.97  |  
  17. all    | 10.201.20.97  | 1409640060 |      3 | 10.201.20.97  |  
  18. all    | 10.201.20.97  | 1409640000 |      4 | 10.201.20.97  |  
  19. all    | 10.201.20.97  | 1409639940 |      5 | 10.201.20.97  |  
  20. all    | 10.201.20.97  | 1409639880 |      6 | 10.201.20.97  |  
  21. all    | 10.201.20.98  | 1409640180 |      1 | 10.201.20.98  |  
  22. all    | 10.201.20.98  | 1409640120 |      2 | 10.201.20.98  |  
  23. all    | 10.201.20.98  | 1409640060 |      3 | 10.201.20.98  |  
  24. all    | 10.201.20.98  | 1409640000 |      4 | 10.201.20.98  |  
  25. all    | 10.201.20.98  | 1409639940 |      5 | 10.201.20.98  |  
  26. all    | 10.201.20.98  | 1409639880 |      6 | 10.201.20.98  |  
  27. +--------+---------------+------------+--------+---------------+  

好了,再外面加一层inner join 再对 rownumber 做限制 就可以拿到目标数据了。

 

    1. set @row=0;set @mid='';select a.*,b.rownum from total_freq_ctrl a inner join (SELECT module, machine, time, case when @mid = machine then @row:=@row+1 else @row:=1 end rownum, @mid:=machine mid FROM total_freq_ctrl order by module,machine,time desc) b on b.module=a.module and b.machine=a.machine and b.time=a.time where b.rownum<5;  
    2. Query OK, 0 rows affected (0.00 sec)  
    3.   
    4. Query OK, 0 rows affected (0.00 sec)  
    5.   
    6. +------------+---------------+--------+------------+-----------+--------+  
    7. time       | machine       | module | total_flow | deny_flow | rownum |  
    8. +------------+---------------+--------+------------+-----------+--------+  
    9. | 1409640360 | 10.201.20.181 | all    |      53937 |      6058 |      1 |  
    10. | 1409640300 | 10.201.20.181 | all    |      52588 |      5701 |      2 |  
    11. | 1409640240 | 10.201.20.181 | all    |      54254 |      5608 |      3 |  
    12. | 1409640180 | 10.201.20.181 | all    |      54684 |      5811 |      4 |  
    13. | 1409640360 | 10.201.20.97  | all    |      50679 |      5307 |      1 |  
    14. | 1409640300 | 10.201.20.97  | all    |      50472 |      5239 |      2 |  
    15. | 1409640240 | 10.201.20.97  | all    |      51586 |      5509 |      3 |  
    16. | 1409640180 | 10.201.20.97  | all    |      50794 |      5378 |      4 |  
    17. | 1409640360 | 10.201.20.98  | all    |      84747 |      5652 |      1 |  
    18. | 1409640300 | 10.201.20.98  | all    |      84506 |      5696 |      2 |  
    19. | 1409640240 | 10.201.20.98  | all    |      84982 |      5513 |      3 |  
    20. | 1409640180 | 10.201.20.98  | all    |      83997 |      5623 |      4 |  
    21. +------------+---------------+--------+------------+-----------+--------+  

转载于:https://www.cnblogs.com/yulonglv/p/6273700.html

你可能感兴趣的文章
spring IOC装配Bean(注解方式)
查看>>
[面试算法题]有序列表删除节点-leetcode学习之旅(4)
查看>>
SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
查看>>
kubernetes_book
查看>>
OpenFire 的安装和配置
查看>>
ZJOI2018游记Round1
查看>>
侧边栏广告和回到顶部
查看>>
https://blog.csdn.net/u012106306/article/details/80760744
查看>>
ios应用版本号设置规则
查看>>
海上孤独的帆
查看>>
error: more than one device and emulator 问题解决
查看>>
Java基础:容器
查看>>
YUV摘要格式
查看>>
【方法2】删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录
查看>>
C# CheckedListBox控件的使用方法
查看>>
【HDOJ】2007平方和与立方和
查看>>
SharePoint自定义程序页面部署 不用重启IIS
查看>>
2014-11-30-2333-Java-数组
查看>>
Nginx 自动补全url地址补全最后的斜线
查看>>
【SQL Server 2008 安装全过程】
查看>>