Yii-CDBCriteria-sql-As语句

Yii-CDBCriteria-sql-As语句,yii,Yii,如何以CDBCriteria格式使用此查询>> SET @orig_lat=122.4058; SET @orig_lon=37.7907; SET @dist=10; SELECT * , 3956 * 2 * ASIN(SQRT(POWER(SIN((@orig_lat - abs(dest.latitude)) * pi()/180 / 2),2) + COS(@orig_lat * pi()/180) * COS(ABS (dest.latitud

如何以CDBCriteria格式使用此查询>>

SET @orig_lat=122.4058;

SET @orig_lon=37.7907;

SET @dist=10;

SELECT *
     , 3956 
     * 2 
     * ASIN(SQRT(POWER(SIN((@orig_lat - abs(dest.latitude)) * pi()/180 / 2),2) + COS(@orig_lat * pi()/180) * COS(ABS (dest.latitude) * pi()/180) * POWER(SIN((dest.longitude - @orig_lon) * pi()/180 / 2), 2))) distance
  FROM business 
HAVING distance < @dist
 ORDER 
    BY distance 
 LIMIT 10;
SET@orig_lat=122.4058;
设置@orig_lon=37.7907;
设置@dist=10;
挑选*
, 3956 
* 2 
*ASIN(SQRT(功率SIN((@orig_lat-abs(目的地纬度))*pi()/180/2),2)+COS(@orig_lat*pi()/180)*COS(abs(目的地纬度)*pi()/180)*功率SIN(目的地经度-@orig_lon)*pi()/180/2)距离
从商
有距离的
命令
远距离
限制10;
有人问。 但我没有得到答案。

考虑将“Haversine”公式放入MySQL函数中,首先:

CREATE FUNCTION `HAVERSINE`(origin_lat FLOAT, origin_long FLOAT, dest_lat FLOAT, dest_long FLOAT) 
RETURNS float 
DETERMINISTIC 
BEGIN 
    DECLARE R FLOAT;
    SET R = 3956 * 2 * ASIN(SQRT(POWER(SIN((origin_lat - dest_lat) * pi()/180 / 2), 2) + COS(origin_lat * pi()/180) * COS(dest_lat * pi()/180) * POWER(SIN((origin_long-dest_long) * pi()/180 / 2), 2))) * 1.609344; 
    RETURN R; 
END;
这样,您可以在查询中调用它

然后,您可以通过创建一个存储过程来进一步抽象,以获取最近的业务。比如:

CREATE PROCEDURE `findClosestBusinessesToLatLng`(lat FLOAT, lng FLOAT)
BEGIN
    SELECT   *, HAVERSINE(lat, lng, businesses.lat, businesses.lng) AS dist
    FROM     businesses
    ORDER BY dist
END
那么您的查询就变成了

Call(findClosestBusinessesToLatLng(122.4058,37.7907));

你能为你的问题提供一些背景吗?你有什么?你需要什么样的结果?也许有人可以提供另一种方式。谢谢你的回答,也请原谅我用一种不好的方式提问。。。但是该方法中是否有使用CDBCriteria的方法?@user1710202您使用CDBCriteria的目的是什么?如果您只需要一组ActiveRecord模型,为什么不在model::findAllBySql()方法中使用上面的方法呢。