MySQL查询附近的人

MySQL中的POINT字段简介

MySQL数据库中,POINT字段是一种空间数据类型,用于存储地理数据的位置信息。这种数据类型属于MySQL的空间扩展,这些扩展允许用户在数据库中存储和操作GIS(地理信息系统)数据。POINT数据类型用于表示地球表面上的一个点,它包含了一个纬度值和一个经度值。

创建包含POINT字段的表

要在MySQL中使用POINT数据类型,首先需要创建一个包含POINT字段的表。这里是一个创建此类表的示例:

CREATE TABLE locations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    position POINT
);

在这个例子中,locations表有三个字段:一个ID,一个名称,以及一个位置信息,位置使用POINT数据类型来存储。

插入POINT数据

插入包含经纬度信息的POINT数据时,可以使用ST_GeomFromTextPoint函数。以下是使用这两种方法的示例:

-- 使用ST_GeomFromText函数
INSERT INTO locations (name, position) VALUES
('Place A', ST_GeomFromText('POINT(30.7333 76.7794)'));
-- 使用Point函数
INSERT INTO locations (name, position) VALUES
('Place B', Point(34.0522, -118.2437));

查询POINT数据

查询包含POINT字段的数据时,可以使用ST_AsText函数来转换POINT数据为可读的字符串格式:

SELECT id, name, ST_AsText(position) AS position FROM locations;

这将返回位置数据的文本表示,例如POINT(30.7333 76.7794)

使用空间函数

MySQL还提供了多种空间函数来处理POINT数据,例如计算两点之间的距离。使用ST_Distance_Sphere函数可以基于球面计算两个点之间的距离(单位为米):

SELECT ST_Distance_Sphere(
    (SELECT position FROM locations WHERE name = 'Place A'),
    (SELECT position FROM locations WHERE name = 'Place B')
) AS distance;

索引POINT字段

为了提高空间查询的性能,可以在POINT字段上创建空间索引。这是创建空间索引的示例:

CREATE SPATIAL INDEX idx_position ON locations(position);

这个空间索引可以帮助MySQL更快地执行空间位置查询,如查找特定范围内的点或计算点之间的距离

m.png

附近的示例:

数据库结构

-- ----------------------------
-- Table structure for lt
-- ----------------------------
DROP TABLE IF EXISTS `lt`;
CREATE TABLE `lt` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(255) DEFAULT NULL COMMENT '名称',
  `lng` double(10,3) DEFAULT NULL,
  `lat` double(10,3) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of lt
-- ----------------------------
INSERT INTO `lt` VALUES ('2', '宝安区美丽365花园        ', '114.039', '22.669');
INSERT INTO `lt` VALUES ('3', '龙岗区佳兆业上品雅园', '114.089', '22.639');
INSERT INTO `lt` VALUES ('4', '龙岗区万科金色半山', '114.095', '22.634');
INSERT INTO `lt` VALUES ('5', '宝安区金港华庭', '113.868', '22.588');

查询语句

SELECT  
s.id,s.name,s.lng,s.lat,   
(st_distance (point (lng, lat),point(113.858202,22.583819) ) / 0.0111) AS distance  
FROM  
wlsq_base.lt s  
HAVING distance<10 
ORDER BY distance

例子
按我的坐标计算周边坐标的距离并由近到远排序

select name,st_distance(point(113.327955,23.129717),point)*111195 as distance,address from table1 where st_distance(point(113.327955,23.129717),point)*111195 < 100 order by distance asc limit 100

注意:其中point字段类型是 point,其值可以通过以下方法写入:

update table1 set point = point(113.123232,24.1324234)

st_distance计算的结果单位是度,需要乘111195(地球半径6371000*PI/180) 是将值转化为米

标签: MySQL

相关文章

php+mysql中如何处理嵌套(子)事务并保持原子性一致

在PHP和MySQL中处理子事务并保持原子性一致性是一个复杂但非常重要的问题,尤其是在处理涉及多个数据库操作的业务逻辑时。以下是一些关键的解决方案、思路、技术要点和涉及的难点讲解。解决方案与思路...

MySQL 触发器详解:创建、查看、示例及性能优化

我平时开发的时候,基本上不会用到这个触发器,主要是碰不到必须用它的场景理由,不过最近的项目中,已经上线了的一套系统中,客户突然要修改一个功能,大致意思就是,就是列表的一个状态,在处理流程的时候,...

MySQL函数使用总结

MySQL提供了许多内置函数,可以方便地进行数据操作和计算。本文将对MySQL中的常用函数进行总结,包括数学函数、字符串函数、日期和时间函数等。数学函数ABS(x):返回x的绝对值。CEIL(x...

Typecho开发数据库常用API操作

表创建和删除在 Typecho 插件开发过程中,往往需要创建表。可以使用query()来进行表的创建、修改或者删除。$db= Typecho_Db::get(); $prefix = $db-&...

MySQL DATE_SUB 函数各种用法及举例

MySQL DATE_SUB 函数简介在MySQL数据库中,DATE_SUB 函数是一个非常有用的日期时间函数,用于从指定日期中减去一个时间或日期间隔。这使得它在处理时间序列数据、生成报告或进行...

图片Base64编码

CSR生成

图片无损放大

图片占位符

Excel拆分文件