2013-09-05 3 views
0

У меня есть две функции: одна для поиска (полнотекстовый поиск), которая возвращает лучшие совпадения, и одну для нахождения ближайшего местоположения от текущего lat/lng.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

Смежные вопросы