Найти ближайший бар при поиске напитка
Проблема: Найти ближайший бар, в котором подают напитки, которые я ищу.
Здесь вы можете найти сгенерированный код MySQL http://pastebin.com/5Uc2ewUW
Запрос API, который взаимодействует с этой проблемой, будет иметь эти параметры
query, String, ideally the drink name
lng, double, the starting longitude
lat, double, the starting latitude
range, integer, max distance in meters (with a default value)
Параметр запроса может выбрать более одного напитка (подумайте о поиске "Водка").
Что было бы хорошей стратегией для написания SQL-запроса с хорошей производительностью?
Я не очень эксперт, но моя идея состоит в том, чтобы
- ВЫБЕРИТЕ бары в ассортименте
- SELECT from drink__bars, где bar_id находится в предыдущем результате выбора
- ПРИСОЕДИНЯЙТЕСЬ к столу с напитками, чтобы получить данные о напитках
Как мне установить порядок на основе расстояния?
Любое предложение приветствуется!
Изменить: Спасибо за ответы до сих пор, но они в основном сосредоточены на расчете расстояния, и это покрыто. Я не понимаю, как заказать результат (то есть напитки), основываясь на расстоянии, которое я имею от баров.
Думайте как этот мета-запрос
SELECT drink.id, drink.name
FROM $DATA_POOL
WHERE drink.name LIKE '%MY_QUERY%'
ORDER BY $ORDER
где
$DATA_POOL
= подмножество напитков, которые являются серверами в барах рядом со мной (я уже могу вычислить, какие бара рядом со мной)$ORDER
= расстояние, которое я имею от бара, на основе параметров APIlng
а такжеlat
2 ответа
Итак, вы знаете, как рассчитать расстояние, скажем, у нас есть подзапрос, который делает это.
Все, что вам нужно сделать, это отсортировать по расстоянию следующим образом:
SELECT d.id, d.name
FROM
drinks d INNER JOIN
drink_bars db ON db.drink_id = d.id INNER JOIN
(SELECT id, <formula for distance> as distance FROM bars) b ON b.id = db.bar_id
WHERE d.name = @RequestedDrink AND b.distance < @MaxDistance
ORDER BY b.distance
Хорошо, удалил старый ответ, так как это было не то, что вы хотели...
это больше, что вам нужно?
SELECT
*,
@radius * 2 * ASIN(SQRT(POWER(SIN(( @startlat - abs(b.lat)) * pi() / 180 / 2),2) +
COS( @startlat * pi()/180) * COS(abs(b.lat) * pi() / 180) * POWER(SIN(( @startlng - b.lng) *
pi() / 180 / 2), 2) )) AS distance
FROM
drinks d
JOIN drink_bars db ON (db.drink_id = d.id)
JOIN bars b ON (b.id_id = db.bar_id)
WHERE d.name LIKE '%mojito%'
ORDER BY distance ASC
Таким образом, запрос ищет напиток и все бары, в которых есть этот напиток, и получает данные, упорядоченные по расстоянию.