1. 程式人生 > >Mysql的Rownum實現

Mysql的Rownum實現

今天被mysql的group by 再度坑了一把

測試環境mysql版本5.1,生產環境mysql版本5.7

於是測試好的功能,到生產垮了。。。

因為group by 的內部演算法大約變了,導致同樣的sql不同環境執行結果不同(不要問我為什麼測試版本資料庫版本與生產不一致,想想就鬧心)

原SQL就不貼了,簡化一下如下

select s.column1, s.column2, s.column3
  from (select t1.column1, t1.column2, t1.column3
          from t_table1 t1
         order by t1.column1, t1.column2) s
 group by s.column1

用過oracle的人都知道,這樣寫group by 是不嚴謹的,因為select後面的欄位只有一個出現在group by 中

於是就出現了我不希望看到的結果,在測試環境group by之後取了子查詢s的第一條,然而生產環境取了最後一條,結果當然就不對了,只能用mysql的變數來解決了

select s.*
  from (SELECT IF(@column1 = t1.column1, @rank := @rank + 1, @rank := 1) AS rank,
               @column1 := t1.column1,
               t1.*
          FROM (SELECT @column1 := NULL, @rank := 0) r, t_table1 t1
         ORDER BY t1.column1, t1.column2) s
 where s.rank = 1

如果只是簡單加個序號就更簡單了

SELECT @rownum := @rownum + 1 AS rownum, t1.*
  FROM (SELECT @rownum := 0) r, t_table1 t1