mysql 分组查询数据时,如何获得用于分页的总记录数?
2013-08-20 16:05
381 查看
主要是想查询符合条件的记录总数,
查询数据使用的sql为:
以下是一些尝试过的方法:
方法一: 一般情况下可以使用DISTINCT来查询总数
但是 查询数据中的sql 有 having 子句,这样得到的总数是没有经过条件筛选的。这个结果是错误的。
方法二: 通过 SQL_CALC_FOUND_ROWS 选项忽略 LIMIT 子句,然后通过FOUND_ROWS()获得查询总数,那么sql改为:
再通过 select FOUND_ROWS(); 获得总数
这样获得的总数没问题,但是由于分页程序需要先获得符合条件的总数,才能生成 page_list ,以及验证offset,和总页数等信息,所以不能先查询数据再得总数。
方法三:和上边的方法类似,只是第一次使用sql获得总数
先:
然后:
最后:
这个没有问题,也可以避免方法二中的问题,但是会返回全部的符合条件的数据,并且返回的数据没有任何作用,只是查询一次总数,所以也不可取。
方法四:使用子查询
这个基本满足了需要,但是效率不是很高,如果子集很大的话,性能上是个问题。
不知道大家还有什么更好的方法? 或者我上述方法中还可以怎么优化?
查询数据使用的sql为:
SELECT SUBSTRING_INDEX(`url`,'/',3) AS host,COUNT(*) AS count FROM `tab` WHERE `type`=4 GROUP BY host HAVING(count >= 5) ORDER BY count desc LIMIT 0,10
以下是一些尝试过的方法:
方法一: 一般情况下可以使用DISTINCT来查询总数
select count(DISTINCT SUBSTRING_INDEX(`url`,'/',3)) as c from tab where type = 4
但是 查询数据中的sql 有 having 子句,这样得到的总数是没有经过条件筛选的。这个结果是错误的。
方法二: 通过 SQL_CALC_FOUND_ROWS 选项忽略 LIMIT 子句,然后通过FOUND_ROWS()获得查询总数,那么sql改为:
SELECT SQL_CALC_FOUND_ROWS SUBSTRING_INDEX(`url`,'/',3) AS host,COUNT(*) AS count FROM `tab` WHERE `type`=4 GROUP BY host HAVING(count >= 5) ORDER BY count desc LIMIT 0,10
再通过 select FOUND_ROWS(); 获得总数
这样获得的总数没问题,但是由于分页程序需要先获得符合条件的总数,才能生成 page_list ,以及验证offset,和总页数等信息,所以不能先查询数据再得总数。
方法三:和上边的方法类似,只是第一次使用sql获得总数
先:
SELECT SUBSTRING_INDEX(`url`,'/',3) AS host,COUNT(*) AS count FROM `tab` WHERE `type`=4 GROUP BY host HAVING(count >= 5)
然后:
select FOUND_ROWS();
最后:
SELECT SUBSTRING_INDEX(`url`,'/',3) AS host,COUNT(*) AS count FROM `tab` WHERE `type`=4 GROUP BY host HAVING(count >= 5) ORDER BY count desc LIMIT 0,10
这个没有问题,也可以避免方法二中的问题,但是会返回全部的符合条件的数据,并且返回的数据没有任何作用,只是查询一次总数,所以也不可取。
方法四:使用子查询
select count(*) as count from (select SUBSTRING_INDEX(url,'/',3) as host,count(*) as c from tab where type=4 group by host having(c >= 5)) as temp
这个基本满足了需要,但是效率不是很高,如果子集很大的话,性能上是个问题。
不知道大家还有什么更好的方法? 或者我上述方法中还可以怎么优化?
相关文章推荐
- mysql 分组查询数据时,如何获得用于分页的总记录数?
- MySQL 查询分页数据中分组后取每组的前N条记录
- MySql-如何查询删除数据表重复记录
- MySql-如何查询删除数据表重复记录
- mysql查询获取分组后最新的一条记录,策略:先排序,然后在次分组查询(默认第一条),就是最新的一条数据了
- Thinkphp数据查询group分组如何取每组的最新记录
- 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案!(zz)
- 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案!(zz)
- MySql如何分级查询上千万行记录的表,并将该大数据显示到界面中
- 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案!(zz)
- 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案!
- 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案!
- Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
- MySQL对数据表进行分组查询(GROUP BY)
- 一步一步学MySQL----9 条件数据记录查询
- 如何避免mysql 主从同步中由于数据记录找不到和主键重复错误导致的同步异常问题
- 分页存储过程(二):分页获得多表连接查询的数据
- 如何优化Mysql执行查询数据的速度
- mysql分组查询并只显示每组数据的前N条数据
- mysql:如何合并两个查询的结果集的数据