我有一个脚本,需要对同一数据子集执行四个相当大的 MySQL 查询。有没有办法将它们组合成一个查询?
这是查询的样子:
Select sum(value) From
( Select lat, lng, value From `pop_geo_199` Where (
(lat Between 38.1768916977 And 39.6131083023) And (lng Between -77.9596650363 And -76.1143349637))
) As FirstCut
Where (acos(0.627895140732*sin(radians(lat)) + 0.778297945677*cos(radians(lat))*cos(radians(lng)-(-1.34454929586))) * 6371 < 79.85)
正如您可能知道的那样,这是一个经纬度点的地理查询。查询所做的是首先创建总表的一个简单方形子集(FirstCut
),然后在其上运行三角函数以获得一个圆形区域。
据我所知,查询速度慢的部分是FirstCut
,因为它正在绘制的表有大约 280 万行。FirstCut
,不过,在这种情况下,只有大约 27,922 行,因此相比之下,三角部分的速度非常快。
问题是,我必须运行其中的一些。但是,它们都可以使用相同的FirstCut
,因为它们是以同一区域为中心的不同半径。我希望能够通过一个查询而不是四个查询来完成这项工作。
这是第二个查询的样子:
Select sum(value) From
( Select lat, lng, value From `pop_geo_199` Where (
(lat Between 38.1768916977 And 39.6131083023) And (lng Between -77.9596650363 And -76.1143349637))
) As FirstCut
Where (acos(0.627895140732*sin(radians(lat)) + 0.778297945677*cos(radians(lat))*cos(radians(lng)-(-1.34454929586))) * 6371 < 48.57)
正如您所看到的,它与另一个完全相同,只是最后一个 WHERE 子句略有不同——条件只是一个较小的半径(48.57 而不是 79.85)。
如何以有效的方式将这两个查询组合成一个查询?
我试过使用 CASE 子句——这是最好的方法吗?
Select
sum(case when (acos(0.627895140732*sin(radians(lat)) + 0.778297945677*cos(radians(lat))*cos(radians(lng)-(-1.34454929586))) * 6371 < 79.85) then value else 0 end),
sum(case when (acos(0.627895140732*sin(radians(lat)) + 0.778297945677*cos(radians(lat))*cos(radians(lng)-(-1.34454929586))) * 6371 < 48.57) then value else 0 end)
From ( Select lat, lng, value From `pop_geo_199` Where ((lat Between 38.1768916977 And 39.6131083023) And (lng Between -77.9596650363 And -76.1143349637)) ) As FirstCut;