MySQL中使⽤groupby进⾏分组时,⼦查询中orderby失效的问
题
这两天做项⽬时,遇到了很奇怪的问题,再对页⾯有相同的元素的数据进⾏分组去重时,再执⾏的SQL相同的情况下,我本地的查询结果和同事本地的查询结果居然显⽰的内容不同。
这是⼀张简单的表,只有id,name,state,create_time这四个属性。
现在我们的需求是:取出名称为张三和李四的两个⼈最新的数据。
再去重时,⾸先我们会想到使⽤ DISTINCT ,再者使⽤group by来进⾏分组去重。
因为⼯作年限的问题,在我使⽤distinct的过程中,主要都是⽤于计数。
下⾯来看⼀下使⽤group by如何实现拿到id为4和5的这两条数据:
select t.* from ( select * from test_table order by id desc )t group by t.name;
在使⽤客户提供的外⽹数据库时:查询出的结果为id=4和id=5的两条数据,没有任何问题,
groupby分组但是当把这条SQL在本地执⾏时,运⾏结果却出⼈意料:
可以看到,执⾏之后的结果并不是4和5的记录,⽽是1和5的记录。怎么会这个样⼦?
原来,客户提供给我们的外⽹数据库使⽤的还是MySQL5.0的版本,在MySQL5.7版本之前,这样写
是没有任何问题的,在执⾏时:⾸先会执⾏⼦查询select * from test_table order by id desc,这时查到的结果为:
然后在使⽤group by进⾏分组时,默认取⾸条数据,所以查询结果为id为5和4的两条数据。
但是在5.7版本之后,MySQL对查询进⾏了优化,⼦查询中的order by再与group by连⽤时并不会⽣效,
那要怎么办呢?
解决办法:在MySQL5.7版本之后,如果要使⽤order by和group by,并使⼦查询中的order by⽣效,就必须加上
关键字 limit。
看⼀下正确的写法:
select t.* from ( select * from test_table order by id desc limit 0,10 )t group by t.name;
查询结果为:
这样就达到了我们的⽬的。(加上limit之后,在⽼版本的数据库中仍然可以得到想要的结果)
说的有点啰嗦,最后说明⼀点:数据库⼀直在更新,为了防⽌客户把数据库进⾏了更新,所以我们还是按照最新的标准来进⾏查询⽐较稳妥。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论