2017-09-24 80 views
0

我遇到了执行一个查询的问题,因为我无法正确地将两个模型链接在一起。基于链接模型的经度和纬度的SQL查询半径

ModelA包含与Location(latitude, longitude)表的OneToOne关系。数据库是Postgres。

查询失败上:

   (
        SELECT * FROM "myapp_location" 
        WHERE id=location_id 
       ) as location, 

它给我的消息:subquery must return only one column

下面是该查询:

''' 
      SELECT * FROM 
      (
       SELECT id, location_id, 
       (
        SELECT * FROM "myapp_location" 
        WHERE id=location_id 
       ) as location, 
       (
        3956 * 2 * 
        ASIN(
        SQRT(
         POWER(
         SIN(({latitude}- location.latitude) * pi()/180/2), 2) + 
         COS({latitude} * pi()/180) * 
         COS(location.latitude * pi()/180) * 
         POWER(SIN(({longitude} - location.longitude) * pi()/180/2), 2) 
        ) 
       ) 
       ) 
       AS distance 
       FROM {model} 
       ORDER BY distance 
      ) items WHERE distance <= {miles} '''.format(latitude=latitude, longitude=longitude, miles=miles, 
                  model=model) 

有没有人有什么好的建议?非常感激。

回答

1

子查询只能返回一个选择值列

你们的这个子查询没有目的反正

  SELECT id, location_id, 
      (
       SELECT * FROM "myapp_location" 
       WHERE id=location_id 
      ) as location, 

转换之后加入,而不是

喜欢的东西以下是可能的路要走

SELECT *, 
    (3956 * 2 * ASIN(SQRT(POWER(SIN(({latitude}- location.latitude) * 
pi()/180/2), 2) + COS({latitude} * pi()/180) * COS(location.latitude * 
pi()/180) * POWER(SIN(({longitude} - location.longitude) * pi()/180/
2), 2)))) AS distance 
FROM {model} 
JOIN myapp_location ON myapp_location.id = location_id 
WHERE distance <= {miles} 
ORDER BY distance 
+0

谢谢!我最初使用JOIN但错误的地方。 它在“myapp_location.latitude” – MayTheSchwartzBeWithYou