Postgresql获取特定半径内的用户
我试图为提出请求的用户获取radius中的所有用户。我创建了一个gpsgeometry类型来存储纬度和经度 我使用了以下代码:Postgresql获取特定半径内的用户,postgresql,postgis,Postgresql,Postgis,我试图为提出请求的用户获取radius中的所有用户。我创建了一个gpsgeometry类型来存储纬度和经度 我使用了以下代码: SELECT * From UserAddresses WHERE ST_DWithin( (Select gps from useraddresses where ID=(Select UserAddressID FROM Users WHERE ID=1)), (Select gps fro
SELECT * From UserAddresses
WHERE ST_DWithin(
(Select gps
from useraddresses
where ID=(Select UserAddressID
FROM Users WHERE ID=1)),
(Select gps
from useraddresses
WHERE ID IN (SELECT UserAddressID
FROM Users
WHERE ID!=1)),
1609*(Select DiscoveryDistance
From Users
WHERE ID=1),true)
但它返回以下错误:
错误:用作表达式的子查询返回多行
我知道这个错误来自于从用户那里选择UserAddressID=1部分,但我无法修复它
我想做的就是将ID=1的GPS与所有用户进行比较,如果他们在半径范围内,则获取他们的数据
有人能帮我理解语法吗?您可以将条件移到子查询之外。ST_DWithin一次为每个几何体处理一行,因此如果使用子查询,它也必须只返回一行,并且您可能有多个ID=一排
请注意,根据分配addressID的方式,只需执行和targetAdr.ID!=srcAdr.ID而不是可能很大的IN子句。我假设您的gps列是几何体类型和公制SRID,或者如果您使用4326,那么您有地理类型
SELECT *
FROM UserAddresses ua1
WHERE EXISTS (SELECT FROM users u1, UserAddresses ua2, users u2
WHERE u2.id=1
AND u1.id<>u2.id
AND u1.useraddressid=ua1.id
AND u2.useraddressid=ua2.id
AND st_DWithin(ua2.gps, ua1.gps, u2.DiscoveryDistance*1609))
记住用GiST索引索引gps列
SELECT *
FROM UserAddresses ua1
WHERE EXISTS (SELECT FROM users u1, UserAddresses ua2, users u2
WHERE u2.id=1
AND u1.id<>u2.id
AND u1.useraddressid=ua1.id
AND u2.useraddressid=ua2.id
AND st_DWithin(ua2.gps, ua1.gps, u2.DiscoveryDistance*1609))