2013-12-24 4 views
0

У меня есть 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.

+0

почему вы делаете такую ​​сложную математику внутри выражения SQL? Я думаю, что было бы лучше (легче обслуживать, проще понять), если вы поместите это вычисление в функцию или сделаете это в принимающей программе. – BigM

+0

Если бы я был вами, я бы обернул бит haversine в пользовательскую функцию - для удобства чтения больше всего на свете – Strawberry

+0

Я тоже об этом думал, но не знаю, как это сделать. – Billie

ответ

0

Вы смешивали внутренние соединения и выбираете утверждения. Попробуйте это:

String query = "SELECT *, (((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 FROM COUPONS inner join Businesses on Coupons.business_id = Businesses.business_id HAVING distance < 20 ORDER BY distance"; 
+0

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Неизвестный столбец 'Businesses.latitude' в 'списке полей' – Billie

+0

@ user1798362 есть столбец 'широты' в таблице« Бизнес »? –

+0

Да, я также использовал его в рабочем запросе. – Billie

0

Вашего SQL Заявление сломан

он должен выглядеть следующим образом

SELECT *, 
     [domaths] AS distance 
FROM table 
     INNER JOIN other_table 
       ON id = id 
0

Вы попробовать это,

SELECT c.business_id, 
     c.agent_name, 
     bus.mybusinessid, 
     bus.latitude, 
     bus.longitude 
FROM coupons c 
     INNER JOIN (SELECT business_id, 
          Count(*) AS mybusinessid, 
        FROM businesses 
        GROUP BY business_id) bus 
       ON bus.business_id = c.business_id; 
Смежные вопросы