2014-09-02 80 views
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是在前面的选择结果
  • JOIN饮料表获得饮料数据

如何根据距离设置订单?

任何建议表示赞赏!

编辑:感谢迄今为止的答案,但他们主要侧重于计算距离,这是涵盖。 我没有得到如何根据距离我从酒吧订购结果(即饮料)。

这样想着元查询

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

其中

  • $DATA_POOL =饮料的子集,是在我附近酒吧服务器(我已经能够计算其酒吧靠近我)
  • $ORDER =我从酒吧得到的距离,基于API参数lnglat
+0

的[计算距离的2 GPS坐标(http://stackoverflow.com/questions/365826/calculate-distance可能重复之间2 gps坐标) – Bulat 2014-09-02 10:26:59

+0

谢谢@Bulat我有更新的问题! – 2014-09-02 10:34:11

+0

@TheChaos的答案适合你吗? – Bulat 2014-09-02 11:07:36

回答

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 

所以查询查找饮料和所有有这种饮料的酒吧并获取按距离排序的数据。

+0

感谢您的回答。这不是关于如何从我的起始经纬度计算距离,我编辑了这个问题,因为它不清楚。 – 2014-09-02 10:35:59

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