MySQL基于最近城市连接两个表

MySQL基于最近城市连接两个表,mysql,sql,join,Mysql,Sql,Join,我有两张桌子。表A结构如下: City | State | Country | Latitude | Longitude | LocPoint(Longitude,Latitude)(spatial index) 我已经在数据类型Point的LocPoint列上创建了空间索引 表B Latitude | Longitude 我想将两个表A和B与表B中点的位置最近的城市的城市状态和国家信息连接起来。我知道获取最近点的公式,我只是停留在连接部分,我将只连接最近点 运行查询后的预期输出 纬度(表B

我有两张桌子。表A结构如下:

City | State | Country | Latitude | Longitude | LocPoint(Longitude,Latitude)(spatial index)
我已经在数据类型Point的LocPoint列上创建了空间索引

表B

Latitude | Longitude
我想将两个表A和B与表B中点的位置最近的城市的城市状态和国家信息连接起来。我知道获取最近点的公式,我只是停留在连接部分,我将只连接最近点

运行查询后的预期输出

纬度(表B)|经度(表B)|城市(离表A的纬度/经度最近)|州|国家

有什么想法吗?

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

现在,您需要计算表B中的点与城市之间的每一距离

 SELECT TA.*, TB.*, dst(TA,TB) as distance
 FROM TableA TA
 CROSS JOIN TableB TB
现在需要使用变量为每个TableB条目选择最小距离。如果您有TableB的PK,将会有所帮助。如果您没有PK,可以使用
CONCAT(tableB.Latitud,tableB.Longitud)


我应该再把它标为复制品。你没有添加任何新内容。不,这不是关于最近的城市部分,我知道,但我不知道如何在连接条件下应用它。我还没有看到在join上实现的类似示例。您现在不能进行连接。您需要计算到每个城市的距离,然后选择最近的
city\u id
,然后您可以执行
JOIN
这就是我想知道的,我们是否可以获得最近的城市并在单个查询中加入它。不,您不能。我的意思是你可以在一个查询中完成它,但它非常大。这有帮助吗?还是有更多的问题?我试图实现该查询,但即使在对两个表进行索引之后,也需要很长时间。我在表B中有1000行,在表A中有100000行。我正在考虑采用不同的方法。当然,这很慢。即
100.000.000
计算。你必须做一些优化。仅计算每个TableB元素周围框中城市的距离。预先计算sin/cos值,因为这些是较慢的操作。你不需要计算每个表,而是执行一个循环,并将结果保存在一个临时表中。另一个选择是使用不同的数据库,我在postgres中做类似的事情,并找到near_链接,在不到5秒内,我每分钟收到4000条记录。
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.