Mysql的Rownum实现

版权声明:如有错误,请留言指正,谢谢! https://blog.csdn.net/songshuguowang/article/details/85284503

今天被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

猜你喜欢

转载自blog.csdn.net/songshuguowang/article/details/85284503
今日推荐