【问题标题】:Find the closest bar, when searching for a drink在寻找饮品时找到最近的酒吧
【发布时间】:2014-10-26 13:28:15
【问题描述】:

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

这里可以找到生成的MySQL代码http://pastebin.com/5Uc2ewUW

与这个问题交互的API Request会有这些参数

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 查询的好策略是什么?

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

  • 选择范围内的条形
  • 从饮料__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

【问题讨论】:

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


【解决方案1】:

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

你还需要这个吗?

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

因此,查询会查找饮料和所有包含该饮料的酒吧,并获取按距离排序的数据。

【讨论】:

  • 感谢您的回答。这并不是关于如何计算与我的起始纬度/经度的距离,我编辑了这个问题,因为它不清楚。
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多