Как объединить SQL-запрос расстояния и ключевого слова? - PullRequest
1 голос
/ 28 апреля 2010

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

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

Вот два запроса, которые работают независимо:

$mysql = "SELECT *, ( 3959 * acos( cos( radians('$search_lat') ) * cos( radians( lat ) ) * cos( radians( longi ) - radians('$search_lng') ) + sin( radians('$search_lat') ) * sin( radians( lat ) ) ) ) AS distance FROM points HAVING distance < '$radius'";

$mysql2 =  "SELECT * FROM `points` LEFT JOIN category USING ( category_id ) WHERE (point_title LIKE '%$esc_catsearch%' OR category.title LIKE '%$esc_catsearch%')";

Вот что я попробовал:

$sql_search = sprintf("SELECT *,point_id FROM points WHERE point_title LIKE '%%%s%%' UNION SELECT *, ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( longi ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM points HAVING distance < '%s' ORDER BY distance LIMIT %d , %d",

 $esc_catsearch,
 mysql_real_escape_string($search_lat),

 mysql_real_escape_string($search_lng),

 mysql_real_escape_string($search_lat),

 mysql_real_escape_string($radius),

 $offset,

 $rowsPerPage);

Но это говорит мне, что нет известной колонки "расстояние". Если я уберу фразу «Заказать по», это сработает, но я все еще не уверен, что это дает мне желаемые результаты. Я также попытался выполнить запрос в обратном порядке сначала с помощью поиска по расстоянию, но это, похоже, игнорирует мое ключевое слово.

Любые мысли приветствуются!

Ответы [ 3 ]

0 голосов
/ 28 апреля 2010

Я думаю, вам нужно иметь псевдоним столбца в первой части вашего объединения:

 $sql_search = sprintf("SELECT *,point_id as distance FROM...
0 голосов
/ 13 мая 2010

Спасибо, ребята. Я смог заставить его работать с помощью этого запроса:

SELECT *,point_id FROM (SELECT *, ( 3959 * acos( cos( radians('37.7749295') ) * cos( radians( lat ) ) * cos( radians( longi ) - radians('-122.4194155') ) + sin( radians('37.7749295') ) * sin( radians( lat ) ) ) ) AS distance FROM points HAVING distance < '25') as distResults LEFT JOIN category USING ( category_id ) WHERE (point_title LIKE '%test%' OR category.title LIKE '%test%') ORDER BY distance LIMIT 0 , 10

Спасибо! * * 1004

0 голосов
/ 28 апреля 2010

Возможно, вместо использования объединения вы можете запустить запрос расстояния как подзапрос, а затем ВЫБРАТЬ из него (обрабатывая его как временную таблицу), чтобы получить запросы, соответствующие поиску по ключевому слову? По сути, что-то общего вида ...

SELECT * FROM (SELECT * FROM ... WHERE distance < X) as distResults WHERE ....

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...