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

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值