使用循环在SQL中查找多个距离

时间:2016-11-07 19:28:06

标签: mysql sql loops stored-procedures distance

我正在解决卡车问题,我有多个配送中心(DC)和多个商店。我有DC和商店的经度和纬度。我不知道如何循环经过47个不同DC的经度和纬度以及4500+以上的经度和纬度,然后找到每个DC的最短距离。我在想这样的事情(但我认为临时表是错误的):

CREATE TEMPORARY TABLE tempStores AS (SELECT * FROM wm_stores)

SET i = 0;   
WHILE i <= (SELECT COUNT(*) FROM tempStores) - 1 DO
    SELECT store_id FROM tempStores LIMIT i,1 INTO thisStoreID; 
    SELECT store_id FROM tempStores LIMIT i,1;

    SET  i = i + 1;
END WHILE;

DECLARE storeLat DOUBLE;
DECLARE storeLon DOUBLE;
DECLARE dcLat DOUBLE;
DECLARE dcLon DOUBLE;
DECLARE storeLatRad DOUBLE;
DECLARE storeLonRad DOUBLE;
DECLARE dcLatRad DOUBLE;
DECLARE dcLonRad DOUBLE;
DECLARE R DOUBLE;
DECLARE distance DOUBLE;
SET R = 3961;                     
SET  storeLat = 37.350659;    ## <-- Basically Loop this here
SET  storeLon = -76.734855;    ## <-- Here
SET  dcLat = 37.192498;        ## <-- Here
SET  dcLon = -77.534201;       ## <-- And here... instead of having it all hard coded.
SET  storeLatRad = PI() * storeLat/180.0;     
SET  storeLonRad = PI() * storeLon/180.0;    
SET  dcLatRad = PI() * dcLat/180.0;        
SET  dcLonRad = PI() * dcLon/180.0;       

1 个答案:

答案 0 :(得分:0)

因此,您需要为每家商店确定最近的分销中心吗?

要获取此信息,我们需要知道每个商店与每个配送中心之间的距离;您建议在循环中执行此操作,但如果您只是让SQL执行此操作,并将所有数据放在临时表(或子查询)中,那么我建议大纲逻辑变为:

SELECT y.StoreID, z.DCID, y.ClosestDCDistance as Distance 
FROM (
    SELECT StoreID, Min(StoreDCDistance) as ClosestDCDistance
    FROM ( SELECT StoreID, DCID, StoreDCDistance FROM TempTable ) x
    GROUP BY StoreID
) y INNER JOIN ( 
    SELECT StoreID, DCID, StoreDCDistance FROM TempTable 
) z ON y.StoreID = z.StoreID AND y.ClosestDCDistance = z.StoreDCDistance

如果你愿意,可以用CTE整理一下。无论如何,所需要的只是填写TempTable(或者如果你愿意,可以将这个逻辑作为子查询);

SELECT StoreID, DCID, (???) as StoreDCDistance INTO TempTable
FROM wm_Stores st, wm_DCs dc      -- haven't got name of DCs table

我不知道如何计算我所说的距离???在括号中,但可能你已经获得了这些信息。我假设一个方程足以计算从LatA,LngA到LatB,LngB的距离 - 尽管我并不期望该方程是一个简单的A + B = C.鉴于你在上面已经得到了什么

(PI()* st.storeLat / 180)显然是它的一个小组成部分,但我无法猜测还需要什么,而且你的帖子没有显示总距离的任何计算

如果单个方程不能完成整个计算,那么您需要使用函数来计算给定LatA,LngA,LatB&amp;的值的距离。 LngB。

希望这有帮助。