查找所提供纬度和经度的最近距离记录的过程


Procedure for finding nearest distance record for the supplied Latitude and Longitude

这是我的SQLFiddle,这是我的过程

我想将此过程重写为简单操作。

它应该将输入作为纬度,Lng,并返回相对于给定的Lat和Long最近的驱动程序ID,lat,long(按desc排序并获取第一个记录)。它包含一些我不需要的其他表。

(问题是我找不到哪个字段是必需的,哪个不是)

DELIMITER //
CREATE  PROCEDURE `driver_latlong`(IN `lat` DECIMAL(20,9), IN `lng` DECIMAL(20,9))
BEGIN
SET @sql = CONCAT('SELECT sd.DriverId, sd.Lat, sd.Long,  sd1.RadiusOfService, @dist:= ( 6371 * acos( cos( radians(',lat,') ) * cos( radians( sd.Lat ) ) * cos( radians( sd.Long ) - radians(',lng,') ) + sin( radians(',lat,') ) * sin( radians( sd.Lat ) ) ) ) AS distance 
        , Case When @dist <= 1 Then sd1.DeliveryFeeOne When @dist<= 2 Then sd1.DeliveryFeeTwo When @dist<= 3 Then sd1.DeliveryFeeThree Else sd1.DeliveryFeeMore End as deliveryfee
        , Case When @dist <= 1 Then sd1.DeliveryTimeOne When @dist<= 2 Then sd1.DeliveryTimeTwo When @dist<= 3 Then sd1.DeliveryTimeThree Else sd1.DeliveryTimeMore End as deliverytime
        , sd.ShopName, sd.Address, sd.LogoFile FROM driver_latlong sd LEFT JOIN  WHERE sd.Status = ''1'' and sd.Lat != 0 and sd.Long != 0 AND ( 6371 * acos( cos( radians(',lat,') ) * cos( radians( sd.Lat ) ) * cos( radians( sd.Long ) - radians(',lng,') ) + sin( radians(',lat,') ) * sin( radians( sd.Lat ) ) ) ) <= sd1.RadiusOfService  ORDER BY distance ASC;');                
                PREPARE stmt FROM @sql;
                EXECUTE stmt;
                DEALLOCATE PREPARE stmt;
    END //
    DELIMITER ;

注意:实际上我从以前的项目中得到了这个过程,所以不需要其他表,只有我们引用的表是driver_latlong

使用以下查询来获取结果,并使用硬编码值代替$lat和$lon

 SELECT ((ACOS(SIN($lat * PI() / 180) * SIN(lat * PI() / 180) + COS($lat * PI() / 180) * COS(lat * PI() / 180) * COS(($lon – lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS `distance` FROM `members` HAVING `distance`<5