2012-05-06 2 views
3

Нижеприведенный запрос находится в пределах цикла (в PHP), который принимает значения по широте, долготе и идентификатору из трех разных массивов. Для каждой позиции/ключа в массиве ближайшая географическая точка выбирается из таблицы, используя запрос ниже.Как использовать один запрос Mysql вместо запроса внутри цикла массива?

Поскольку размер массива обычно составляет около 500, так что 500 наборов входов, для которых нужно найти ближайшее географическое положение, требуется некоторое время.

Мой вопрос: Можно ли использовать один запрос с использованием входных массивов из php одновременно и выбрав набор всех ближайших географических позиций для каждого ключа массива?

$sql="SELECT 
id, d, tolon, tolat, du, 
     (3959 * acos(cos(radians($lat1)) 
       * cos(radians(travel.tolat)) 
       * cos(radians(travel.tolon) - radians($lon1)) 
       + sin(radians($lat1)) 
       * sin(radians(travel.tolat)))) AS distance 
FROM travel 
WHERE userid = $id AND tolon > $lonlow AND tolon < $lonhigh AND tolat > $latlow AND tolat < $lathigh 
having distance < $maxdistance ORDER BY distance 
"; 
+0

Худший вариант решения будет UNION, но кто-то опубликует лучшую идею. Вы пробовали ..OR .. –

+0

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

+0

@ ingo Хорошо, что с ними связано нелегко, поскольку соединение определяется минимальным расстоянием между географическими координатами в двух таблицах, которые вычисляются по формуле. – BastiaanWW

ответ

1

Я не думаю, что вы будете делать гораздо лучше, чем группа союзов, хотя добавление limit 1 является хорошей идеей, если вам нужно только ближе. Множество союзов будет очень длинной строкой sql, и есть ограничения, которые вы можете нанести. (max packet size - это настройка, я считаю). Вы должны были бы, возможно, объединить 100 союзов одновременно.

Вы должны получить много, если в таблице указаны индексы, предназначенные для этого типа запроса. mysql имеет поддержку для spatial indexes, которую вы должны серьезно рассмотреть, потому что регулярные индексы не очень хорошо работают для этого варианта использования.

+0

В дополнение к этому ответу я использовал уникальные значения из массивов, чтобы ограничить количество записей, необходимых из базы данных. – BastiaanWW

Смежные вопросы