2014-03-30 71 views
1

我有当独立运行两个SQL查询产生正确的结果合并2个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 

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

如何合并两个查询?我尝试使用连接学校桌上的地理数据表。但我不知道剩下的。对不起,如果这是一个愚蠢的问题。我对SQL世界非常陌生。

+0

如果2个查询之间的列#相同以及列的格式,你应该使用一个联盟。是这样吗? –

+1

这些表是否有任何外键? –

+0

@BrianDeMilia:附件是http://tinypic.com/view.php?pic=5s305&s=8# – Mic

回答

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 
+0

获取错误#1054 - 'where子句'中的'distance'列未知 – Mic

+0

立即尝试,'distance'未被计算 –

+0

现在正在工作。但是order_by呢?这不是一个沉重的查询,所以距离必须计算两次? – Mic

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; 
+0

感谢您的答案。但是我认为你已经加入了查询1的查询2.如果我错了,请纠正我。 我需要的是在查询2上连接查询1.查询2是主查询。 – Mic

+0

保存数据的主要标准是什么?没有距离? – Mihai

+0

主要查询是找到“政府初级”学校。该搜索后来被精炼以找到附近的学校。 – Mic