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`

解决方案 »

  1.   

    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`
      

  2.   

    select *
    from (
    SELECT `id` , `title` , idlifegeo( 114.0869411, `coordinateX` , 22.5431184, `coordinateY` ) distant`
    FROM `idlife_shop`
    )T  
    ORDER BY T.distant
      

  3.   

    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
      

  4.   

    其实你自定义的这个函数,到底计算了一次还是两次,对性能的影响极小,可以忽略不计。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担心的性能问题~
      

  5.   

    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