【问题标题】:Calculating spatial distances in mysql and order by distance在mysql中计算空间距离并按距离排序
【发布时间】:2018-11-18 13:17:38
【问题描述】:

我有 3 个包含以下字段的表:

  1. org(org_id、org_name、位置)
  2. office(office_id、office_name、位置、org_id
  3. 项目(project_id、project_name、位置)

我想找到离给定项目最近的办公室

SELECT office.office_name, org.org_name, 
       st_distance_sphere(office.location, project.location)*0.001 as 
       distance 
FROM   office JOIN org JOIN project
WHERE  office.org_id=org.org_id AND 
       project.project_id=7 
ORDER BY distance asc;

上述查询有效并为我提供离项目最近的办公室,但我只需要为每个组织获取 1 个最近的办公室

因此我尝试了以下使用半连接

SELECT office.office_name, org.org_name, 
       st_distance_sphere(office.location, project.location)*0.001 as  
       distance 
FROM  office JOIN org JOIN project  
INNER JOIN 
  ( SELECT org.org_id as orgid1, 
       min(st_distance_sphere(office.location, project.location)*0.0001) as 
       distance1 
   FROM office JOIN org JOIN project 
   WHERE 
      office.org_id=org.org_id and project.project_id=7
   GROUP BY org.org_id
   ) AS t 
     ON t.orgid1=org.org_id and t.distance1=min(st_distance_sphere(office.location,project.location)*0.001) 
 WHERE  office.org_id=org.org_id AND project.project_id=7 ;

使用这个,我得到以下错误,原因似乎是 min(st_distance_sphere) 函数。删除它会消除错误,但我没有得到想要的结果。

ERROR 1111 (HY000):组函数使用无效

我做错了什么?任何想法高度赞赏。谢谢

【问题讨论】:

    标签: mysql group-by geospatial greatest-n-per-group


    【解决方案1】:

    我只需要为每个组织找到 1 个最近的办公室

    SELECT 
      A.office_name, A.org_name, A.distance
    FROM
      (SELECT 
        office.office_name,
        org.org_name, 
        st_distance_sphere(office.location, project.location)*0.001 as distance 
      FROM  office JOIN org JOIN project
      WHERE  office.org_id=org.org_id AND 
           project.project_id=7) A 
      JOIN 
      (SELECT 
         org.org_name, 
         MIN(st_distance_sphere(office.location, project.location)*0.001) as distance 
      FROM   office JOIN org JOIN project
      WHERE  office.org_id=org.org_id AND 
           project.project_id=7
      GROUP BY org.org_name) B
      ON A.org_name=B.org_name AND A.distance=B.distance
    ORDER BY A.distance ASC;
    

    【讨论】:

    • 这一直只给出一个结果。我需要 1 个最近的办公室 PER org。因此,如果有 10 个组织,我们需要 10 个结果。
    • 这给出了错误“ORDER BY 子句的表达式 #1 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列 'A.distance';这是不兼容的使用 sql_mode=only_full_group_by"
    • 太棒了,它有效:) 我明白为什么我的查询也不起作用。距离是一个计算字段,因此我们需要将它填充到 2 个临时表中并加入,不像我这样做的方式。如果距离已经在 Db 中,我的方法会奏效。
    • @cdiaga,我需要在大型数据库上使用它——知道这是否会高效吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多