2013-07-31 1 views
2

Я делаю проект в PHP. У меня есть таблица ресторанов с полями LAT и LONG. Я хочу получить Рестораны (со специфическим cuisine_id), чье расстояние меньше 5km от USER. Я использую ниже функцию для вычисления расстояния:Использование функции PHP во время запроса базы данных

// Function for Getting distance between two coordinates. 
function getDistance($latitude1, $longitude1, $latitude2, $longitude2) { 
    $earth_radius = 6371; 
    $dLat = deg2rad($latitude2 - $latitude1); 
    $dLon = deg2rad($longitude2 - $longitude1); 

    $a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * sin($dLon/2) * sin($dLon/2); 
    $c = 2 * asin(sqrt($a)); 
    $d = $earth_radius * $c; 
    return $d; 
} 

Можно ли использовать функцию при выборе записи из базы данных?

Может кто-то пожалуйста, скажите мне пример запрос для получения (с использованием в качестве LIMIT значения) Ресторанов, которые находятся на расстоянии 5 км или менее (Пользователь LAT и LONG доступны) за один раз (если это возможно, используя выше getDistance функция).

+0

Вы либо использовать его для создания запроса mysql запускает или запускает mysql-запрос, а затем использует его для результатов. mysql не может запустить php-функцию как часть запроса – Anigel

+0

«Вы либо используете его для генерации запросов mysql run» - Как я могу это сделать? Можете ли вы показать пример, поскольку я новичок в SQL. – noob

+0

Учитывая, что вы не указали какие-либо сведения о своей базе данных, вам будет сложно ответить – Anigel

ответ

1

Взгляните на эту question. Я думаю, что если вы напишете свою функцию с помощью mysql, это будет eaiser для использования с запросами. Я пытался написать версию функции .. (синтаксис не может быть совершенным)

DELIMITER $$ 

CREATE FUNCTION distance(LAT1 DOUBLE(10,6), LON1 DOUBLE(10,6), LAT2 DOUBLE(10,6), LON2 DOUBLE(10,6)) 
RETURNS DOUBLE(10,2) 
DETERMINISTIC 
BEGIN 
DECLARE r, dLat, dLon, a, c, d DOUBLE(10,6); 
SET r=6371.0; 
SET LAT1 = RADIANS(LAT1); 
SET LON1 = RADIANS(LON1); 
SET LAT2 = RADIANS(LAT2); 
SET LON2 = RADIANS(LON2); 
SET dLat = LAT2-LAT1; 
SET dLon = LON2-LON1; 
SET a = SIN(dLat/2.0) * SIN(dLat/2.0) + COS(LAT1) * COS(LAT2) * SIN(dLon/2.0) * SIN(dLon/2.0); 
SET c = 2 * ASIN(SQRT(a)); 
SET d = c * r; 
RETURN d; 
END 
$$ 

DELIMITER ; 

Тогда вы могли бы сделать что-то вроде этого ...

$userLatitude = ... 
$userLongitude = ... 
$cuisine = ... 

SELECT cuisine_id, distance(LAT,LONG,$userLatitude,$userLongitude) as Distance FROM Restaurants WHERE cuisine_id = $cuisine HAVING Distance < 5 ORDER BY Distance LIMIT 10; 
1

Выполнение sql-сервера и выполнение функции php - это две разные вещи, их нельзя смешивать. Вы должны либо выполнить эту задачу в отдельных шагах (сначала вычислите, затем запросить), либо вам нужно реализовать свою функцию внутри SQL-сервера, а не внутри php. Это возможно, это называется Stored procedure.

1

этот вопрос как-то подобное с mysql-great-circle-distance-haversine-formula

SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance 
FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20; 
Смежные вопросы