在寻找饮料时找到最近的酒吧

时间:2014-09-02 10:01:22

标签: mysql sql query-optimization geospatial spatial-index

问题:找到最接近我正在寻找饮料的酒吧。

在这里,您可以找到生成的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查询的好策略是什么?

我不是很专业,但我的想法是

  • 范围内的选择栏
  • 从drink__bars中选择bar_id在上一个选择结果中
  • 加入饮品表以获取饮品数据

如何根据距离设置订单?

任何建议都表示赞赏!

编辑:感谢答案,但是他们主要关注的是计算距离,并且已经涵盖了。 我不知道如何根据酒吧的距离订购结果(即饮品)。

像这个元查询一样思考

SELECT drink.id, drink.name 
FROM $DATA_POOL
WHERE drink.name LIKE '%MY_QUERY%' 
ORDER BY $ORDER

其中

  • $DATA_POOL =饮料的一个子集,是我附近酒吧的服务器(我已经可以计算出哪些酒吧在我附近)
  • $ORDER =根据API参数lnglat
  • 与条形图的距离

2 个答案:

答案 0 :(得分:0)

好的,删除了旧答案,因为它不是你想要的......

这是你需要的更多吗?

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

因此,查询会查找饮料以及所有饮用酒吧并获取按距离排序的数据。

答案 1 :(得分:0)

所以你知道如何计算距离,假设我们有一个子查询来完成它。

您需要做的就是按照这样的距离排序:

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