sql 两组经纬度,判定重合区域

业务场景:两个店铺的配送范围会有重合的地方,需要判定用户下单的地址是否在重复的区域内,若是,需计算出用户到两个店铺分别的距离。

数据基建:
(1)配送范围是用经纬度的形式存在系统里的,[(经度1,纬度1),(经度2,纬度2),…];
(2)店铺的经纬度
(3)用户的经纬度

需求:要用sql来实现

谢谢!!


Select 
      Sum(If(`zone`='z0_0x1_0',`value`,0)) as `z0_0x1_0`, 
      Sum(If(`zone`='z0_0x1_1',`value`,0)) as `z0_0x1_1`, 
      Sum(If(`zone`='z0_0x1_2',`value`,0)) as `z0_0x1_2`, 
      Sum(If(`zone`='z0_0x1_3',`value`,0)) as `z0_0x1_3`, 
      Sum(If(`zone`='z0_1x1_0',`value`,0)) as `z0_1x1_0`, 
      Sum(If(`zone`='z0_1x1_1',`value`,0)) as `z0_1x1_1`, 
      Sum(If(`zone`='z0_1x1_2',`value`,0)) as `z0_1x1_2`, 
      Sum(If(`zone`='z0_2x1_0',`value`,0)) as `z0_2x1_0`, 
      Sum(If(`zone`='z0_2x1_1',`value`,0)) as `z0_2x1_1`, 
      Sum(If(`zone`='z0_3x1_0',`value`,0)) as `z0_3x1_0`, 
      Sum(If(`zone`='z0_3x1_1',`value`,0)) as `z0_3x1_1`, 
      Sum(If(`zone`='z0_0',`value`,0)) as `z0_0`, 
      Sum(If(`zone`='z0_1',`value`,0)) as `z0_1`, 
      Sum(If(`zone`='z0_2',`value`,0)) as `z0_2`, 
      Sum(If(`zone`='z0_3',`value`,0)) as `z0_3`, 
      Sum(If(`zone`='z1_0',`value`,0)) as `z1_0`, 
      Sum(If(`zone`='z1_1',`value`,0)) as `z1_1`, 
      Sum(If(`zone`='z1_2',`value`,0)) as `z1_2`, 
      Sum(If(`zone`='z1_3',`value`,0)) as `z1_3` 
    From 
     (Select `lat`, `lng`, `value`, 
       Case 
          When ((`dist_0` Between 2.8723597844095 And 4.3343662110324) And (`dist_1` Between 3.6260179152491 And 5.4681062617155)) Then 'z0_0x1_0' 
          When ((`dist_0` Between 2.8723597844095 And 4.3343662110324) And (`dist_1` Between 2.1278369006061 And 3.6260179152491)) Then 'z0_0x1_1' 
          When ((`dist_0` Between 2.8723597844095 And 4.3343662110324) And (`dist_1` Between 1.3333495959677 And 2.1278369006061)) Then 'z0_0x1_2' 
          When ((`dist_0` Between 2.8723597844095 And 4.3343662110324) And (`dist_1` Between 0 And 1.3333495959677)) Then 'z0_0x1_3' 
          When ((`dist_0` Between 1.68658498678 And 2.8723597844095) And (`dist_1` Between 3.6260179152491 And 5.4681062617155)) Then 'z0_1x1_0' 
          When ((`dist_0` Between 1.68658498678 And 2.8723597844095) And (`dist_1` Between 2.1278369006061 And 3.6260179152491)) Then 'z0_1x1_1' 
          When ((`dist_0` Between 1.68658498678 And 2.8723597844095) And (`dist_1` Between 1.3333495959677 And 2.1278369006061)) Then 'z0_1x1_2' 
          When ((`dist_0` Between 1.0573158612197 And 1.68658498678) And (`dist_1` Between 3.6260179152491 And 5.4681062617155)) Then 'z0_2x1_0' 
          When ((`dist_0` Between 1.0573158612197 And 1.68658498678) And (`dist_1` Between 2.1278369006061 And 3.6260179152491)) Then 'z0_2x1_1' 
          When ((`dist_0` Between 0 And 1.0573158612197) And (`dist_1` Between 3.6260179152491 And 5.4681062617155)) Then 'z0_3x1_0' 
          When ((`dist_0` Between 0 And 1.0573158612197) And (`dist_1` Between 2.1278369006061 And 3.6260179152491)) Then 'z0_3x1_1' 
          When ((`dist_0` Between 2.8723597844095 And 4.3343662110324)) Then 'z0_0' 
          When ((`dist_0` Between 1.68658498678 And 2.8723597844095)) Then 'z0_1' 
          When ((`dist_0` Between 1.0573158612197 And 1.68658498678)) Then 'z0_2' 
          When ((`dist_0` Between 0 And 1.0573158612197)) Then 'z0_3' 
          When ((`dist_1` Between 3.6260179152491 And 5.4681062617155)) Then 'z1_0' 
          When ((`dist_1` Between 2.1278369006061 And 3.6260179152491)) Then 'z1_1' 
          When ((`dist_1` Between 1.3333495959677 And 2.1278369006061)) Then 'z1_2' 
          When ((`dist_1` Between 0 And 1.3333495959677)) Then 'z1_3' 
       End As `zone` 

       From 
        (Select `lat`, `lng`, `value`, 
         (acos(0.65292272498833*sin(radians(`lat`)) + 0.75742452772129*cos(radians(`lat`))*cos(radians(`lng`)-(-1.2910922519714))) * 6371) as `dist_0`, 
         (acos(0.65251345816785*sin(radians(`lat`)) + 0.75777713538338*cos(radians(`lat`))*cos(radians(`lng`)-(-1.2916315412569))) * 6371) as `dist_1` 
        From `pop` 
        Where 
         ((`lat` Between 40.714353892125 And 40.810300107875) And (`lng` Between -74.037474145971 And -73.910799854029)) Or 
         ((`lat` Between 40.673205922895 And 40.789544077105) And (`lng` Between -74.081798776797 And -73.928273223203)) 
        ) 
       As FirstCut 
     ) 
     As Zonecut 
假设你的表是这样的
##tb1:用户,经度,纬度
##tb2:店家,经度1,经度2,纬度1,纬度2

select case when t1.经度>t2.经度1 and t1.经度<t2.经度2 and t1.纬度>t2.纬度1 and t1.纬度<t2.纬度2
and t1.经度>t3.经度1 and t1.经度<t3.经度2 and t1.纬度>t3.纬度1 and t1.纬度<t3.纬度2 
then 1 else 0 end 是否重合,
6371 * acos(cos(radians(t1.纬度)) * cos(radians(t2.纬度)) * cos(
radians(t1.经度) - radians(t2.经度)) + sin(radians(t1.纬度)) * sin(radians(t2.纬度))) as 距离1,
6371 * acos(cos(radians(t1.纬度)) * cos(radians(t3.纬度)) * cos(
radians(t1.经度) - radians(t3.经度)) + sin(radians(t1.纬度)) * sin(radians(t3.纬度))) as 距离2
from tb1 t1
join tb2 t2 on 1=1
join tb2 t3 on 1=1