将2个sql查询合并为一个

时间:2014-03-30 18:55:27

标签: mysql sql geospatial geo

我有两个sql查询,当运行独立时产生正确的结果

查询1

SELECT id,
(6371 * acos( cos( radians(9.977364864079215) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(76.58620953448485) ) + sin( radians(9.977364864079215) ) * sin( radians( latitude ) ) ) ) 
            AS distance 
            FROM geodata HAVING distance < 20 
            ORDER BY distance 
            LIMIT 0 , 20;   

查询2

SELECT DISTINCT e.* FROM schools e  
WHERE (
    (e.type = 'preprimary')
) 
AND(
    e.title LIKE '%government%' 
)   
LIMIT 0, 10

我想将第一个查询与第二个查询合并,以便它应该返回所有“prerimary”类型的学校,其标题如“政府”位于20KM范围内,结果需要按距离排序。

如何合并这两个查询?我尝试在学校桌子上使用JOINING地理数据表。但我不知道其余的。对不起,如果这是一个愚蠢的问题。我对SQL世界很陌生。

2 个答案:

答案 0 :(得分:2)

SELECT DISTINCT school.* FROM
 ( SELECT geodata.id,
(6371 * acos( cos( radians(9.977364864079215) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(76.58620953448485) ) + sin( radians(9.977364864079215) ) * sin( radians( latitude ) ) ) ) 
        AS distance ,school.*
        FROM geodata LEFT JOIN school on geodata.id=school.id
        WHERE
         (school.type = 'preprimary')
        AND(
         school.title LIKE '%government%' 
         )   
        AND school.id IS NOT NULL
        HAVING distance < 20 )x
 ORDER BY x.distance 
        LIMIT 0 , 10; 

答案 1 :(得分:1)

试试这个:

 SELECT *
   From (
 SELECT DISTINCT e.* ,
       (6371 * acos( cos( radians(9.977364864079215) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(76.58620953448485) ) + sin( radians(9.977364864079215) ) * sin( radians( latitude ) ) )
        ) as distance
  FROM schools e  
LEFT JOIN geodata g ON e.id=g.id
 WHERE (e.type = 'preprimary')
   AND ( e.title LIKE '%government%' )
 ) as s
  Where s.distance  < 20
  Order by s.distance