Расчет пространственных расстояний в mysql и порядок по расстоянию - PullRequest
0 голосов
/ 08 июня 2018

У меня есть 3 таблицы со следующими полями:

  1. org (org_id, org_name, location)
  2. office (office_id, office_name, location, org_id )
  3. project (project_id, project_name, location)

Я хочу найти ближайшие офисы кданный проект

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 ближайший офис на организацию

Следовательно, япопробовал, следующее с использованием semi-join

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) .Устранение, которое устраняет ошибку, но я не получаю желаемых результатов.

ОШИБКА 1111 (HY000): недопустимое использование групповой функции

Что я делаю неправильно?Любые мысли высоко ценятся.Спасибо

1 Ответ

0 голосов
/ 08 июня 2018

Мне нужно получить только 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;
...