mysql方法计算了2次,怎么办

sugang_ximi 2011-08-05 04:52:54
SELECT `id` , `title` , idlifegeo( 114.0869411, `coordinateX` , 22.5431184, `coordinateY` ) `distant`
FROM `idlife_shop`
WHERE idlifegeo( 114.0869411, `coordinateX` , 22.5431184, `coordinateY` ) <= 50
ORDER BY `distant`
...全文
101 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxmli198914 2011-08-08
  • 打赏
  • 举报
回复
select `id`,'title','distant' from idlife_shop as a inner join (select `id`,idlifegeo( 114.0869411, `coordinateX` , 22.5431184, `coordinateY` ) as `distant` from idlife_shop) as b on a.id=b.id where distant<=50 order by distant
zalvsa 2011-08-08
  • 打赏
  • 举报
回复
结贴率真低……
sugang_ximi 2011-08-06
  • 打赏
  • 举报
回复
多谢各位回帖(除了1楼),等待高手出现...
liuxinran819 2011-08-05
  • 打赏
  • 举报
回复
其实你自定义的这个函数,到底计算了一次还是两次,对性能的影响极小,可以忽略不计。LZ可以试着用BENCHMARK函数试试执行一百万(或者一千万、一亿、十亿次都可以)次这个函数花费多长时间:
mysql>SELECT BENCHMARK(1000000,(SELECT idlifegeo( 114.0869411, `coordinateX` , 22.5431184, `coordinateY` )FROM `idlife_shop` limit 1));
这样你就知道它对性能的影响有多大了~
不过据我估计,它是可以小到完全不需要担心的,LZ要相信CPU的计算能力~
如果LZ要让这个查询看起来美丽一点的话,可以把WHERE替换成HAVING:
SELECT `id` , `title` , idlifegeo( 114.0869411, `coordinateX` , 22.5431184, `coordinateY` ) `distant`
FROM `idlife_shop`
HAVING `distant`<= 50
ORDER BY `distant`
不过MySQL文档说,没有使用GROUP BY或者聚合函数的HAVING会和WHERE合并,也就是说被优化器优化后,还是使用了WHERE。
说了一大圈,还是没有回答的楼主的问题,抱歉~我上网找了很久,也没有找到关于这个问题的答案:到底是计算了一次还是两次。
希望有高人能解答这个问题,不过,这应该不是一个需要LZ担心的性能问题~
ACMAIN_CHM 2011-08-05
  • 打赏
  • 举报
回复
这个没办法,写了两次自然会计算两次。
sugang_ximi 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 rucypli 的回复:]

SQL code
select *
from (
SELECT `id` , `title` , idlifegeo( 114.0869411, `coordinateX` , 22.5431184, `coordinateY` ) distant`
FROM `idlife_shop`
)T
where T.distant>50
ORDER BY T.distant
[/Quote]
这样是可以查询,不过速度没有用2个方法时的快额;
rucypli 2011-08-05
  • 打赏
  • 举报
回复
select *
from (
SELECT `id` , `title` , idlifegeo( 114.0869411, `coordinateX` , 22.5431184, `coordinateY` ) distant`
FROM `idlife_shop`
)T
where T.distant>50
ORDER BY T.distant
rucypli 2011-08-05
  • 打赏
  • 举报
回复
select *
from (
SELECT `id` , `title` , idlifegeo( 114.0869411, `coordinateX` , 22.5431184, `coordinateY` ) distant`
FROM `idlife_shop`
)T
ORDER BY T.distant
sugang_ximi 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 visionsky1986 的回复:]

idlifegeo( 114.0869411, `coordinateX` , 22.5431184, `coordinateY` )这个函数你调了两次,当然会计算两次,你这么些:
SELECT `id` , `title` , idlifegeo( 114.0869411, `coordinateX` , 22.5431184, `coordinateY` ) as idlifegeores……
[/Quote]
这样不行额
visionsky1986 2011-08-05
  • 打赏
  • 举报
回复
idlifegeo( 114.0869411, `coordinateX` , 22.5431184, `coordinateY` )这个函数你调了两次,当然会计算两次,你这么些:
SELECT `id` , `title` , idlifegeo( 114.0869411, `coordinateX` , 22.5431184, `coordinateY` ) as idlifegeoresult `distant`
FROM `idlife_shop`
WHERE idlifegeoresult <= 50
ORDER BY `distant`
ningyb 2011-08-05
  • 打赏
  • 举报
回复

56,687

社区成员

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

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