2013-09-05 19 views
0

我有兩個函數,一個用於搜索(全文搜索),返回最佳匹配,另一個用於查找當前經緯度的最近位置。MySQL使用動態變量加入兩個表

最終結果將是一個搜索功能,從您所在的位置查找最近的商店。

搜索:

SELECT *,MATCH(name) AGAINST('*McDonalds*' IN BOOLEAN MODE) AS `score_name_0`, MATCH(`city`) 
AGAINST('McDonalds*' IN BOOLEAN MODE) AS `score_city_0` FROM `stores` 

WHERE MATCH(name) AGAINST('*McDonalds*' IN BOOLEAN MODE) OR 
MATCH (`city`) AGAINST('McDonalds*' IN BOOLEAN MODE) 
ORDER BY (`score_name_0` + `score_city_0`) DESC 

尋找最近的:

SELECT *, (3959 * acos(cos(radians('.$lat.')) * cos(radians(lat)) * cos(radians(lng) - 
radians('.$long.')) + sin(radians('.$lat.')) * sin(radians(lat)))) AS distance 

FROM pinpoints 
INNER JOIN stores WHERE stores.id=pinpoints.store HAVING distance < 25 ORDER BY distance 

我嘗試:

SELECT *,MATCH(name) AGAINST('*McDonalds*' IN BOOLEAN MODE) AS `score_name_0`, 
MATCH(`city`) AGAINST('McDonalds*' IN BOOLEAN MODE) AS `score_city_0` 

FROM `stores` 
JOIN pinpoints ON (3959 * acos(cos(radians(".$lat.")) * cos(radians(pinpoints.lat)) * cos(radians(pinpoints.lng) - 
radians(".$long.")) + sin(radians(".$lat.")) * sin(radians(pinpoints.lat)))) AS distance 

WHERE stores.id=pinpoints.id 
AND MATCH(name) AGAINST('*McDonalds*' IN BOOLEAN MODE) OR 
MATCH (`city`) AGAINST('McDonalds*' IN BOOLEAN MODE) 
HAVING distance < 25 ORDER BY distance, (`score_namn_0` + `score_stad_0`) DESC 

一直停留相當長的一段時間,似乎並不能想出一個好方式來結合他們兩個,所以它找到最接近的匹配,並相應地對其進行排序。

回答

0

你有事情所有的地方,我沒有測試過這一點,但它應該工作...

SELECT * 
    FROM (SELECT *, MATCH(name) AGAINST('*McDonalds*' IN BOOLEAN MODE) AS `score_name_0`, 
      MATCH(`city`) AGAINST('McDonalds*' IN BOOLEAN MODE) AS `score_city_0`, 
     (3959 * acos(cos(radians(".$lat.")) * cos(radians(pinpoints.lat)) * cos(radians(pinpoints.lng) - radians(".$long.")) + sin(radians(".$lat.")) * sin(radians(pinpoints.lat)))) AS distance 
     FROM `stores` 
      JOIN pinpoints ON stores.id=pinpoints.id 
     WHERE stores.id=pinpoints.id 
      AND (MATCH(name) AGAINST('*McDonalds*' IN BOOLEAN MODE) OR 
      MATCH (`city`) AGAINST('McDonalds*' IN BOOLEAN MODE)) 
) AS tmp_tbl 
WHERE distance < 25 
ORDER BY distance ASC, (`score_namn_0` + `score_stad_0`) DESC 
+0

曾與一些修改。太好了謝謝!對不起,亂碼! – Emil