У меня есть 2 таблицы:SQL установить переменную при использовании внутреннего соединения
1. Coupons with columns {id, business_id, name}
2. Businesses with columns {business_id, name, latitude, longitude}
В общем, это купоны Managment сайт, каждый бизнес может предложить купоны ..
Coupons.business_id
является Business.business_id, что купоны, связанные с.
Я хочу получить все купоны, которые достаточно близки (20KM) к местоположению пользователя.
У меня есть следующий SQL код, который даст это мне, что предприятиям в этом диапазоне:
NOTE: lat and lng is the user's longitude and latitude.
String query = "SELECT *,(((acos(sin((" + lat + "*pi()/180)) * "
+" sin((`Latitude`*pi()/180))+cos((" + lat + "*pi()/180)) * "
+ " cos((`Latitude`*pi()/180)) * cos(((" + lng + "- `Longitude`)* "
+ " pi()/180))))*180/pi())*60*1.1515 " +
") as distance " +
"FROM `Businesses` HAVING distance < 20 ORDER BY distance";
Я пытался использовать этот код для получения близких купонов: (назовем его second query
)
String query = "SELECT * FROM COUPONS inner join Businesses on Coupons.business_id = Businesses.business_id"
+ " (((acos(sin((" + lat + "*pi()/180)) * "
+" sin((`Businesses.latitude`*pi()/180))+cos((" + lat + "*pi()/180)) * "
+ " cos((`Businesses.latitude`*pi()/180)) * cos(((" + lng + "- `Businesses.longitude`)* "
+ " pi()/180))))*180/pi())*60*1.1515 " +
") as distance HAVING distance < 20 ORDER BY distance";
Я получаю следующее сообщение об ошибке:
Hibernate: SELECT * FROM COUPONS inner join Businesses on Coupons.business_id = Businesses.business_id (((acos(sin((33.207933*pi()/180)) * sin((`Businesses.latitude`*pi()/180))+cos((33.207933*pi()/180)) * cos((`Businesses.latitude`*pi()/180)) * cos(((35.570246- `Businesses.longitude`)* pi()/180))))*180/pi())*60*1.1515) as distance HAVING distance < 20 ORDER BY distance
Dec 24, 2013 12:36:31 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [jsp] in context with path [/InternetProject] threw exception [org.hibernate.exception.SQLGrammarException: could not execute query] with root cause
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'as distance HAVING distance < 20 ORDER BY distance' at line 1
В чем проблема во втором вопросе и как его исправить? Спасибо заранее .. Использование mySQL.
почему вы делаете такую сложную математику внутри выражения SQL? Я думаю, что было бы лучше (легче обслуживать, проще понять), если вы поместите это вычисление в функцию или сделаете это в принимающей программе. – BigM
Если бы я был вами, я бы обернул бит haversine в пользовательскую функцию - для удобства чтения больше всего на свете – Strawberry
Я тоже об этом думал, но не знаю, как это сделать. – Billie