怎么获取刚才查询的 记录的 count(*)

dsgdsg 2009-05-22 09:56:26
加精
在我的应用当中,需要选出符合条件的记录
如SQL:
步骤1:
select *,16 as tableNumber from merger_16 where  gridID in (55162406,55162407,55162408,55180406,55180407,55180408,55198406,55198407,55198408) order by ((lon-104.079048)*(lon-104.079048)+(lat-30.658125)*(lat-30.658125)) asc

但是因为要用的分页,,所以说要先查出
步骤2:
select count(*) from(select *,16 as tableNumber from merger_16 where  gridID in (55162406,55162407,55162408,55180406,55180407,55180408,55198406,55198407,55198408) order by ((lon-104.079048)*(lon-104.079048)+(lat-30.658125)*(lat-30.658125)) asc) t


所以我的步骤顺序为:
步骤2查询完成,接着步骤1:(步骤2>步骤1)


我用的mysql5,java语言做的开发
我目前的应用对效率要求很高..
请问一下能不能通过修改SQL语句或者是其他的办法来提高效率?
在线等!
...全文
1683 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
thb513 2011-05-12
  • 打赏
  • 举报
回复
不错....
hongwa 2009-11-04
  • 打赏
  • 举报
回复
谢谢!!
dsgdsg 2009-05-25
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 ACMAIN_CHM 的回复:]
引用是的
我需要总记录数,然后用程序来算出总页数等等的一系列分页信息!

如果是这样。 在你的SELECT语句中加上修饰SQL_CALC_FOUND_ROWS 试一下。

加上SQL_CALC_FOUND_ROWS之后,即使你用了limit n,m ,SELECT FOUND_ROWS() 仍会返回满足条件记录的总数。这样,你执行完 select SQL_CALC_FOUND_ROWS  之后,再取一下记录总数就行了。


SQL codemysql>select*fromcalendar;+------------+|d|+------------+|2006-11-01|…
[/Quote]

对了.
谢谢!!
ACMAIN_CHM 2009-05-25
  • 打赏
  • 举报
回复

[Quote]是的
我需要总记录数,然后用程序来算出总页数等等的一系列分页信息![/Quote]

如果是这样。 在你的SELECT语句中加上修饰SQL_CALC_FOUND_ROWS 试一下。

加上SQL_CALC_FOUND_ROWS之后,即使你用了limit n,m ,SELECT FOUND_ROWS() 仍会返回满足条件记录的总数。这样,你执行完 select SQL_CALC_FOUND_ROWS 之后,再取一下记录总数就行了。


mysql> select * from calendar;
+------------+
| d |
+------------+
| 2006-11-01 |
| 2006-11-02 |
| 2006-11-03 |
| 2006-11-04 |
| 2006-11-05 |
| 2006-11-06 |
| 2006-11-07 |
| 2006-11-08 |
| 2006-11-09 |
| 2006-11-10 |
| 2006-11-11 |
| 2006-11-12 |
| 2006-11-13 |
| 2006-11-14 |
| 2006-11-15 |
| 2006-11-16 |
| 2006-11-17 |
| 2006-11-18 |
| 2006-11-19 |
| 2006-11-20 |
+------------+
20 rows in set (0.00 sec)

mysql> select * from calendar order by d limit 10,5;
+------------+
| d |
+------------+
| 2006-11-11 |
| 2006-11-12 |
| 2006-11-13 |
| 2006-11-14 |
| 2006-11-15 |
+------------+
5 rows in set (0.00 sec)

mysql> select FOUND_ROWS() ;
+--------------+
| FOUND_ROWS() |
+--------------+
| 15 |
+--------------+
1 row in set (0.03 sec)

mysql>
mysql> select SQL_CALC_FOUND_ROWS * from calendar order by d limit 10,5;
+------------+
| d |
+------------+
| 2006-11-11 |
| 2006-11-12 |
| 2006-11-13 |
| 2006-11-14 |
| 2006-11-15 |
+------------+
5 rows in set (0.00 sec)

mysql> select FOUND_ROWS() ;
+--------------+
| FOUND_ROWS() |
+--------------+
| 20 |
+--------------+
1 row in set (0.00 sec)

mysql>



dsgdsg 2009-05-25
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 ACMAIN_CHM 的回复:]
你是想用这个数据总数,来显示WEB页面上的总页数?如果只是这样,应该可以简单的实现。
[/Quote]\
是的
我需要总记录数,然后用程序来算出总页数等等的一系列分页信息!
ACMAIN_CHM 2009-05-25
  • 打赏
  • 举报
回复

你是想用这个数据总数,来显示WEB页面上的总页数?如果只是这样,应该可以简单的实现。
dsgdsg 2009-05-25
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 ACMAIN_CHM 的回复:]
楼主想实现什么样的功能?建议你直接描述功能,这样或放有其它解法。否则象现在一样,只是在猜你想做什么,并且完全不理解为什么要 select count(*) from (select ....) 而不直接取 select found_row()

你想先拿到符合条件的记录数(到某点的距离在范围内的),比如nRowCnt,然后想进行什么操作?一般分页显示是固定的limit x,20这种方式啊。
[/Quote]

拿到记录数了..
然后我再根据从进到远的距离来排序.分页输出啊!!
wwwwb 2009-05-22
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 WWWWA 的回复:]
那就用:
select *,16 as tableNumber from merger_16 where  gridID in
(55162406,55162407,55162408,55180406,55180407,55180408,55198406,55198407,55198408)
order by
((lon-104.079048)*(lon-104.079048)+(lat-30.658125)*(lat-30.658125))
asc
select found_rows() into @ee;
UPDATE LSB SET BZ=@ee

这种方式嘛。
[/Quote]

可以测试一下速度
ACMAIN_CHM 2009-05-22
  • 打赏
  • 举报
回复

select count(*) from (select * from table a where id>20)

select * from table a where id>20
是两句不同的SQL语句,不会利用缓存。


感觉上,你还是用临时表解决比较方便。
WWWWA 2009-05-22
  • 打赏
  • 举报
回复
那就用:
select *,16 as tableNumber from merger_16 where gridID in
(55162406,55162407,55162408,55180406,55180407,55180408,55198406,55198407,55198408)
order by
((lon-104.079048)*(lon-104.079048)+(lat-30.658125)*(lat-30.658125))
asc
select found_rows() into @ee;
UPDATE LSB SET BZ=@ee

这种方式嘛。
dsgdsg 2009-05-22
  • 打赏
  • 举报
回复
但是我感觉似乎没有用到缓存,
这2句


select count(*) from (
select *,16 as tableNumber
from merger_16 where gridID in
(55162406,55162407,55162408,55180406,55180407,55180408,55198406,55198407,55198408)
and kind like '0130%'
order by
((lon-104.079048)*(lon-104.079048)+(lat-30.658125)*(lat-30.658125))
asc
) t



select *,16 as tableNumber from merger_16
where gridID in
(55162406,55162407,55162408,55180406,55180407,55180408,55198406,55198407,55198408)
and kind like '0130%'
order by
((lon-104.079048)*(lon-104.079048)+(lat-30.658125)*(lat-30.658125))
asc
limit 0,10


我在程序中打印出来2句都用了差不多的时间 31ms(我的CPU 是 P7350,2G内存)
WWWWA 2009-05-22
  • 打赏
  • 举报
回复
第二次用SQL语句时,可以用到缓存
dsgdsg 2009-05-22
  • 打赏
  • 举报
回复
那这样呢?
会不会用到缓存?
先查询

select count(*) from( select *,16 as tableNumber from merger_16 where gridID in (55162406,55162407,55162408,55180406,55180407,55180408,55198406,55198407,55198408) order by ((lon-104.079048)*(lon-104.079048)+(lat-30.658125)*(lat-30.658125)) asc ) t


再查询

select *,16 as tableNumber from merger_16 where gridID in
(55162406,55162407,55162408,55180406,55180407,
55180408,55198406,55198407,55198408)
order by
(
(lon-104.079048)*(lon-104.079048)
+(lat-30.658125)*(lat-30.658125)
) asc limit 10,20


因为select count (*) from ( 语句2 ) t 和下面查询的是差不多的查询,只是加了 limit begin,end
这样会用到缓存不?
WWWWA 2009-05-22
  • 打赏
  • 举报
回复
这样:
select *,16 as tableNumber from merger_16 where gridID in
(55162406,55162407,55162408,55180406,55180407,55180408,55198406,55198407,55198408)
order by
((lon-104.079048)*(lon-104.079048)+(lat-30.658125)*(lat-30.658125))
asc
select found_rows() into @ee;
UPDATE LSB SET BZ=@ee

打开LSB的记录集,取BZ字段的值,假设LSB只有一个字段BZ
ACMAIN_CHM 2009-05-22
  • 打赏
  • 举报
回复

[Quote=引用 13 楼 dsgdsg 的回复:]
或者能不能在mysql中设置,每次选取的count(*) 都把 from ( select ...)的内容缓存?
然后...
[/Quote]

不太清楚你的实际需求了。
那为什么不直接先执行 select 得到结果集,然后直接用java mysql api中的函数得到这个记录总数?

如果按照你的方法,MySQL本身不会,它是以SQL语句来缓存的。不过你可以把语句1的结果集存到一个临时表中,然后对这个临时表select count(*) ,但效率上好象不会有什么提高啊。
dsgdsg 2009-05-22
  • 打赏
  • 举报
回复
我是需要这样
先 select count (*);然后我的程序根据count(*)出的结果来取得 limit 的begin 和end
[Quote=引用 11 楼 WWWWA 的回复:]
select *,16 as tableNumber from merger_16 where  gridID in
(55162406,55162407,55162408,55180406,55180407,55180408,55198406,55198407,55198408)
order by
((lon-104.079048)*(lon-104.079048)+(lat-30.658125)*(lat-30.658125))
asc
limit begin,end;

[/Quote]
如下:我还没得到count(*),不能进行分页啊!所以不能这么!
select found_rows()into @ee;
select @ee;
wwwwb 2009-05-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 dsgdsg 的回复:]
或者能不能在mysql中设置,每次选取的count(*) 都把 from  (  select  ...)的内容缓存?
然后...
[/Quote]
直接生成临时表,用完DROP
dsgdsg 2009-05-22
  • 打赏
  • 举报
回复
或者能不能在mysql中设置,每次选取的count(*) 都把 from ( select ...)的内容缓存?
然后...
ACMAIN_CHM 2009-05-22
  • 打赏
  • 举报
回复

在java中应该可以直接通过函数得到返回的记录数量。比如在C 中可以 用 mysql_num_rows() 得到一个结果集的记录数量。
WWWWA 2009-05-22
  • 打赏
  • 举报
回复
select *,16 as tableNumber from merger_16 where gridID in (55162406,55162407,55162408,55180406,55180407,55180408,55198406,55198407,55198408) order by ((lon-104.079048)*(lon-104.079048)+(lat-30.658125)*(lat-30.658125)) asc ;
select found_rows()into @ee;
select @ee;
加载更多回复(14)

56,681

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧