如何从另一个表获取值并将结果插入另一个查询

时间:2019-11-27 15:08:10

标签: mysql sql

我正在尝试构建一个基本的SQL查询,在该数据库中我的sql数据库中有一个加油站表和另一个POI表,我想在POI半径内获得所有加油站

我有以下查询:

        SELECT *, ( 6371000 * acos( cos( radians(15.4383252) )
 * cos( radians( petrol_stations.lat ) ) * cos( radians( petrol_stations.lng ) - radians(47.0450591) ) 
+ sin( radians(15.4383252) ) * sin(radians(petrol_stations.lat)) ) ) 
AS distance FROM petrol_stations HAVING distance < 500

似乎工作正常,但是我必须将POI的坐标硬编码到查询中。如果提供了诸如main square之类的名称,是否可以修改查询,以使POI坐标从另一个表中拉出?

先谢谢了。

1 个答案:

答案 0 :(得分:1)

假设您有一个georef poi表为

  table_poi 

  id    name    lat           lng 
  1     my_poi  47.0450591 15.4383252 

您可以尝试交叉连接所有与您的POI相关的所有petrol_station

  SELECT *
    , ( 6371000 * acos( cos( radians(table_poi.lng) )
      * cos( radians( petrol_stations.lat ) ) * cos( radians( petrol_stations.lng ) 
           - radians(table_poi.lat) ) 
      + sin( radians(table_poi.lng) ) * sin(radians(petrol_stations.lat)) ) ) 
  AS distance 
  FROM petrol_stations  
  CROSS JOIN table_poi 
  HAVING distance < 500

或使用where(按MarlinPierce的要求)

  SELECT *
    , ( 6371000 * acos( cos( radians(table_poi.lng) )
      * cos( radians( petrol_stations.lat ) ) * cos( radians( petrol_stations.lng ) 
           - radians(table_poi.lat) ) 
      + sin( radians(table_poi.lng) ) * sin(radians(petrol_stations.lat)) ) ) 
  AS distance 
  FROM petrol_stations  
  CROSS JOIN table_poi 
  WHERE ( 6371000 * acos( cos( radians(table_poi.lng) )
      * cos( radians( petrol_stations.lat ) ) * cos( radians( petrol_stations.lng ) 
           - radians(table_poi.lat) ) 
      + sin( radians(table_poi.lng) ) * sin(radians(petrol_stations.lat)) ) ) < 500

,如果要过滤POI名称

  SELECT *
    , ( 6371000 * acos( cos( radians(table_poi.lng) )
      * cos( radians( petrol_stations.lat ) ) * cos( radians( petrol_stations.lng ) 
           - radians(table_poi.lat) ) 
      + sin( radians(table_poi.lng) ) * sin(radians(petrol_stations.lat)) ) ) 
  AS distance 
  FROM petrol_stations  
  WHERE table_poi.name like '%your_poi_name%'
  CROSS JOIN table_poi 
  HAVING distance < 500