Postgresql获取特定半径内的用户

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

我试图为提出请求的用户获取radius中的所有用户。我创建了一个gpsgeometry类型来存储纬度和经度

我使用了以下代码:

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))