mysql8计算商家距离,按照由近及远排序
要计算商家距离并按照距离排序,可以使用MySQL 8中的空间函数和索引。以下是一个例子:
- 创建商家表
CREATE TABLE merchants ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), location POINT, SPATIAL INDEX (location) ) Engine=InnoDB;
- 插入商家数据
INSERT INTO merchants (name, location) VALUES ('商家A', ST_PointFromText('POINT(120.1435 30.2567)')), ('商家B', ST_PointFromText('POINT(120.1723 30.3249)')), ('商家C', ST_PointFromText('POINT(120.0674 30.2987)')), ('商家D', ST_PointFromText('POINT(119.9876 30.1459)')), ('商家E', ST_PointFromText('POINT(120.0452 30.1243)'));
- 查询距离最近的商家
#默认是米 SELECT id, name, ST_Distance_Sphere(location, ST_PointFromText('POINT(120.1325 30.2678)')) AS distance FROM merchants ORDER BY distance ASC; # 把米转换成公里 SELECT id, name, CONCAT(ROUND(ST_Distance_Sphere(location, ST_PointFromText('POINT(113.597219 34.783522)'))/1000,2),'公里') AS distance FROM merchants ORDER BY distance ASC;
在此示例中,ST_Distance_Sphere()函数用于计算两个点之间的球面距离(单位为米)。查询将返回距离指定坐标最近的商家,并按距离从近到远排序。
注意:为了使此查询更有效率,需要使用空间索引
idx_location
。 -
如果在添加索引时,出现了如下错误:All parts of a SPATIAL index must be NOT NULL
-
请执行如下语句:
ALTER TABLE merchants MODIFY location point NOT NULL; ALTER TABLE merchants ADD SPATIAL INDEX (location);