寻找最近的酒吧,在寻找饮料时。

4
问题:查找最靠近的酒吧,提供我正在寻找的饮料。

在这里,您可以找到生成的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,表示我与酒吧之间的距离

谢谢@Bulat,我已经更新了问题! - Leonardo Rossi
@TheChaos的回答对你有用吗? - Bulat
2个回答

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

因此,该查询寻找一种饮料以及所有拥有这种饮料的酒吧,并按距离排序获取数据。


谢谢你的回答。这并不是关于如何计算我起始纬度/经度距离的问题,我编辑了问题因为它不够清晰。 - Leonardo Rossi

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接