Mysql:實現row_number分組排序功能

Mysql:實現row_number分組排序功能

 

sql server 和 oracle 中均有row_number 實現功能,即對查詢結果進行分組排序添加字段。而在mysql中無內置函數,需要曲線救國。

表結構:

CREATE TABLE `total_freq_ctrl` (

  `time` int(10) unsigned NOT NULL,

  `machine` char(64) NOT NULL,

  `module` char(32) NOT NULL,

  `total_flow` int(10) unsigned NOT NULL,

  `deny_flow` int(10) unsigned NOT NULL,

  PRIMARY KEY (`module`,`machine`,`time`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

 

1、通過內表連接進行對應字段大小計數方式判斷該條記錄所處的row_number

 

SELECT machine, deny_flow, total_flow, time

FROM total_freq_ctrl A

WHERE ( SELECT COUNT(machine)

        FROM total_freq_ctrl

        WHERE machine = A.machine AND time > A.time) < 1

     AND A.module = 'all'

ORDER BY A.time desc;

  在修改排序序號的位置,修改你需要取出的序列號,即爲取出N-1的序號

2、引入@rownum 將表內數據添加序列號

set @row=0;

SELECT module, machine, time, @row:=@row+1 rownum

FROM total_freq_ctrl

order by module,machine,time desc

limit 10;

 

結果展示:

+--------+---------------+------------+--------+

| module | machine       | time       | rownum |

+--------+---------------+------------+--------+

| all    | 10.201.20.181 | 1409640060 |      1 |

| all    | 10.201.20.181 | 1409640000 |      2 |

| all    | 10.201.20.181 | 1409639940 |      3 |

| all    | 10.201.20.181 | 1409639880 |      4 |

| all    | 10.201.20.97  | 1409640060 |      5 |

| all    | 10.201.20.97  | 1409640000 |      6 |

| all    | 10.201.20.97  | 1409639940 |      7 |

| all    | 10.201.20.97  | 1409639880 |      8 |

| all    | 10.201.20.98  | 1409640060 |      9 |

| all    | 10.201.20.98  | 1409640000 |     10 |

+--------+---------------+------------+--------+

 

3、添加@mid來進行分組,按mid進行分組添加rownum

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;

 

結果展示:

+--------+---------------+------------+--------+---------------+

| module | machine       | time       | rownum | @mid:=machine |

+--------+---------------+------------+--------+---------------+

| all    | 10.201.20.181 | 1409640180 |      1 | 10.201.20.181 |

| all    | 10.201.20.181 | 1409640120 |      2 | 10.201.20.181 |

| all    | 10.201.20.181 | 1409640060 |      3 | 10.201.20.181 |

| all    | 10.201.20.181 | 1409640000 |      4 | 10.201.20.181 |

| all    | 10.201.20.181 | 1409639940 |      5 | 10.201.20.181 |

| all    | 10.201.20.181 | 1409639880 |      6 | 10.201.20.181 |

| all    | 10.201.20.97  | 1409640180 |      1 | 10.201.20.97  |

| all    | 10.201.20.97  | 1409640120 |      2 | 10.201.20.97  |

| all    | 10.201.20.97  | 1409640060 |      3 | 10.201.20.97  |

| all    | 10.201.20.97  | 1409640000 |      4 | 10.201.20.97  |

| all    | 10.201.20.97  | 1409639940 |      5 | 10.201.20.97  |

| all    | 10.201.20.97  | 1409639880 |      6 | 10.201.20.97  |

| all    | 10.201.20.98  | 1409640180 |      1 | 10.201.20.98  |

| all    | 10.201.20.98  | 1409640120 |      2 | 10.201.20.98  |

| all    | 10.201.20.98  | 1409640060 |      3 | 10.201.20.98  |

| all    | 10.201.20.98  | 1409640000 |      4 | 10.201.20.98  |

| all    | 10.201.20.98  | 1409639940 |      5 | 10.201.20.98  |

| all    | 10.201.20.98  | 1409639880 |      6 | 10.201.20.98  |

+--------+---------------+------------+--------+---------------+

 

注:1Mysql中添加rownum功能,主要是group by變量改變,設置order by 排序進行rownum增加。再根據子查詢,joinhaving 等條件進行對rownum篩選。

2、若只是取出前幾條而不添加rownum字段值,可以直接進行內連接表,count內表值order by外表值的條數來進行控制選出的rownum

3、若只是簡單的排除數據可以利用exists,not exists,join ,in條件等。

 

注:這個用了幾次發現應該注意的問題:

 

1、爲什麼沒有分類排序?排序總是1等

     可能是排序的group by變量沒有設置正確,沒有初始賦值set @mid=''語句,變量設置在判斷條件之前進行了賦值操作,即@mid:=machine一定要在case when之後。

 

2、爲什麼排序的結果不是安裝分組的順序,總是1或者隨機的等?

    可能在排序的結果集中,你只是添加了order by的排序字段,但是沒有將group by變量添加到order by裏面。其中我想mysql是不斷的對@mid:=machine的賦值來進行排序,那麼一定要讓數據先按照分組並排序好的狀態下才能添加正確的id。如果沒有對分組字段排序,就等於檢索的結果是不確定的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章