2014-09-02 83 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