Mysql的Rownum實現
阿新 • • 發佈:2019-01-14
今天被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