Нужно объединить два запроса - PullRequest
0 голосов
/ 15 августа 2011

Я пытаюсь объединить два запроса в один, и я надеюсь, что вы мне поможете.

В запросе содержится список записей (почтовых индексов), которые находятся на определенном расстоянии.Это работает просто отлично.($ lat, $ lng, $ zip и $ size пока жестко заданы).

Теперь мне нужно объединить это с поиском записей из другой таблицы, которые соответствуют этим почтовым индексам.

Это мой запрос:

SELECT
    source.zc_zip, 
    source.zc_location_name,
    ACOS(
         SIN(RADIANS(zc_lat)) * SIN(RADIANS($lat)) 
         + COS(RADIANS(zc_lat)) * COS(RADIANS($lat)) * COS(RADIANS(zc_lon)
         - RADIANS($lng))
         ) * 6371 AS distance
FROM zip_coordinates AS source
WHERE zc_id <> $zip
GROUP BY source.zc_zip
HAVING distance < $size
ORDER BY distance LIMIT 10;

Я уже изменил его, чтобы он выглядел так, потому что у нас есть совпадение, когда source.zc_zip совпадает с info.meta_value:

SELECT
    source.zc_zip, 
    source.zc_location_name,
    info.*,
    ACOS(
         SIN(RADIANS(zc_lat)) * SIN(RADIANS($lat)) 
         + COS(RADIANS(zc_lat)) * COS(RADIANS($lat)) * COS(RADIANS(zc_lon)
         - RADIANS($lng))
         ) * 6371 AS distance
FROM zip_coordinates AS source, wp_postmeta AS info
WHERE zc_id <> $zip AND info.meta_value = source.zc_zip
GROUP BY source.zc_zip
HAVING distance < $size
ORDER BY distance LIMIT 10;

Нет необходимостисказать, что этот запрос действительно медленный (> 1 сек.).

Может кто-нибудь помочь с этим?Спасибо!: -)

- Доминик

1 Ответ

1 голос
/ 15 августа 2011

Я спросил у ОП следующее:

Вы хотите объединить 2 запроса, вы даете мне один (в 2 версиях), но где второй запрос, который нужно объединить с первым?

Ответ ОП:

  • Первый - это основной запрос, но в нем отсутствует информация, которую я пытался получить с помощью второго запроса. Второй запрос медленный, поэтому я ищу альтернативу второму, где я объединил первый запрос с вещами, которые я нашел в Интернете. - днхнхн 15 августа 11 в 18: 18

$lat, $lng, $zip и $size пока жестко заданы, поэтому добавление расстояния в виде вычисляемого столбца с хранимой процедурой, вероятно, не будет вашей идеей. ORDER для вычисляемого значения, очевидно, заставляет вас создавать временную таблицу со всеми строками и индексом для вычисляемого значения. Так что время растет с количеством строк. Возьмите книгу по математике из средней школы и рассчитайте квадрат вокруг вашего круга. Используйте эти значения, чтобы исключить 99% zc_lat и zc_lon из расчета, включая ограничения в WHERE.

Альтернатива : если подумать об этом прошлой ночью, лучшим способом было бы программно: собрать 10 ближайших живых людей на внутренней площади круга. Таким образом, вам не нужны никакие вычисления в запросе, вы вычисляете границу ограничения в программе.

Если это приводит к слишком малому числу случаев, напишите другой запрос, выбирая в области между внутренним и внешним квадратом, используя формулу выше. Он будет работать как ракета: вы делаете расчеты только на некоторых записях, если большинство ваших клиентов не живут ровно между 9 и 11 милями, когда вы пытаетесь найти круг 10 миль.

...