使用group by分组之后子查询的order by排序失效的问题
来源:互联网 发布:文案好的淘宝店 编辑:程序博客网 时间:2024/05/02 04:15
需求:
1.首页的查询需要按照lrsj进行排序
2.每一条数据通过fchrq,chxh进行分组
原始的sql
SELECT fchrq,chxh FROM(SELECT top 100 percent chxh,fchrq,lrsj FROM HCZZQD_source where chxh is not null <include refid="resultWhereSqlv2" /> ORDER BY lrsj desc) TGROUP BY fchrq,chxh
按照正常逻辑貌似没错,子查询中是按照录入时间进行了排序,查询是使用group by进行了分组;
在使用分页插件后,应该是可以获取到数据的;
实际上确实获取到了数据,但是order by lrsj并没有生效,取出来的数据只是group by进行了分组;
方案一:<mission false>
top 100 percent 是取查询出来的所有数据,网上的偏方: top 100 percent 改为 top 99.999 percent 原理我并没有理解,但是对我的sql并没有生效,我不知道这个改动的适用范围
方案二:<mission success>
实际上很简单的sql,sql会对数据先进行分组在进行排序,而我上述写法是先排序再分组,之所以还这样写是因为分组的时候fchrq ,chxh 里面不包含lrsj.
所以我走进了误区:我的子查询好像只能获取字段fchrq,chxh.并不能获取lrsj, 然而事实上并不是
百度失败后,盯着sql突然想到了,按照group by进行分组确实不能直接获取到lrsj,因为是两个lrsj,可是我可以获取第一排数据的lrsj也就是max(lrsj);
于是改动成功:
SELECT fchrq,chxh FROM HCZZQD_source where chxh is not null <include refid="resultWhereSqlv2" /> group BY fchrq,chxh ORDER by max(lrsj) desc
不需要子查询,直需要查询这个表一次即可;
阅读全文