Как получить все результаты в радиусе от предоставленного lat и long от MySql Query

У меня есть таблица MySQL на моем локальном сервере. В таблице указаны широта и долгота мест, отмеченных пользователями. Я пытаюсь получить все идентификаторы, которые помечают свои места в пределах 1 километра от предоставленной широты и долготы. Но мой результат не ожидается.

Таблица: map_locations

id  user_id lat     lng     place_name
1   1   28.584688   77.31593    Sec 2, Noida
2   2   28.596026   77.314494   Sec 7, Noida
3   5   28.579876   77.356131   Sec 35, Noida
4   1   28.516831   77.487405   Surajpur, Greater Noida
5   1   28.631451   77.216667   Connaught Place, New Delhi
6   2   19.098003   72.83407    Juhu Airport, Mumbai

а вот PHP скрипт

$lat = '28.596026';
$long = '77.314494';
$query = "SELECT  id,
(6371 * acos( cos( radians($lat) ) * cos( radians('lat') ) *
cos( radians('lng') - radians($long)) +
sin(radians($lat)) * sin(radians('lat')) )
) as distance
FROM  map_locations
HAVING  'distance' < 1
ORDER BY  id
LIMIT  25";

$_res = mysqli_query($conn, $query) or die('Error query:  '.$query);
$detail = array();
$i=0;
while($row = $_res->fetch_assoc()) {
$detail[$i] = $row['id'];
$i++;
}
print_r($detail);

Результат:

Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
)

Запрос возвращает все записи из таблицы. Может кто-нибудь, пожалуйста, дайте мне знать, что не так в запросе?

0

Решение

Ваш запрос содержит несколько строк в кавычках, таких как ‘lat’, ‘long’ и ‘distance’, где он должен содержать имена столбцов, такие как lat, long и distance.

В частности это заканчивается

 HAVING 'distance' < 0.5

Это всегда так, потому что MySQL всегда приводит строки к числам при их использовании в числовом контексте. Это похоже на MySQL как HAVING 0 < 0.5, Ты хочешь

 HAVING distance < 0.5

Попробуйте этот запрос. (http://sqlfiddle.com/#!9/4f5116/5/2)

SELECT id,
(6371 * acos( cos( radians($lat) ) * cos( radians(lat) ) *
cos( radians(lng) - radians($long)) + sin(radians($lat)) *
sin(radians(lat)) )) as distance
FROM map_locations
HAVING distance < 0.5

И остерегайтесь! Когда вы получите тысячи строк в вашем map_locations Стол этот запрос будет медленнее, чем нью-йоркский автобус в пробке. Вы должны исследовать использование ограничивающих рамок, чтобы ускорить его. Прочитай это.

1

Другие решения

Да, возможно, что все записи будут менее 1 км, единственное, что я предлагаю вам попробовать изменить расстояние.

Позвольте мне еще раз пересмотреть запрос, а затем проверить, дает ли он вам идеальный результат или нет

$query = "SELECT id,(6371 * acos( cos( radians($lat) ) * cos( radians('lat') ) * cos( radians('lng') - radians($long)) + sin(radians($lat)) * sin(radians('lat')) )) as distance FROM map_locations HAVING 'distance' < 0.5 ORDER BY id LIMIT 25";

Также вы можете проверить это дальше, изменив значение широты, заданное вручную,

$lat = '21.591026';
$long = '79.314994';

Дайте мне знать, если возникнет какой-либо запрос.

0

По вопросам рекламы [email protected]