MySQL-根据最近的城市加入两个表

时间:2017-04-10 20:30:59

标签: mysql sql join

我有两张桌子。表A结构是

City | State | Country | Latitude | Longitude | LocPoint(Longitude,Latitude)(spatial index)

我在数据类型为Point LocPoint 列上创建了空间索引。

表B

Latitude | Longitude

我想将最近城市的城市州和国家信息与表B中的点的位置连接起来两个表A和B.我知道得到最近点的公式,我只是卡在加入部分的地方我将只加入最近点。

运行查询后的预期OutPut

Latitude(TableB) | longitude(TableB)| City(Nearest from lat/Lon from Table A) | State | Country

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

让我们调用function dst来计算两点之间的距离以简化。

现在,您需要计算TableB中您的城市与城市之间的距离。

 SELECT TA.*, TB.*, dst(TA,TB) as distance
 FROM TableA TA
 CROSS JOIN TableB TB

现在您需要使用变量为每个TableB条目选择最小距离。如果您有TableB的PK,会有所帮助。如果您没有PK,可以使用CONCAT (tableB.Latitud,tableB.Longitud)

SELECT *
FROM (
    SELECT *, 
           @rn := IF(@pk = tb_pk,
                     @rn + 1,
                     IF(@pk := tb_pk, 1, 1)
                    ) as rn       
    FROM (
         SELECT TA.*, TB.*, dst(TA,TB) as distance
         FROM TableA TA
         CROSS JOIN TableB TB
         ) T
    CROSS JOIN ( SELECT @rn := 0, @pk := 0 ) as var
    ORDER BY distance DESC -- Find the near city
   ) Y
WHERE Y.rn = 1  -- Only select the first city for group.