MySQL基于最近城市连接两个表
我有两张桌子。表A结构如下: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
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.