Mysql 使用内部联接时的SQL集合变量

Mysql 使用内部联接时的SQL集合变量,mysql,sql,Mysql,Sql,我有两张桌子: 1. Coupons with columns {id, business_id, name} 2. Businesses with columns {business_id, name, latitude, longitude} 一般来说,这是一个优惠券管理网站,每家企业都可以提供优惠券 优惠券.business\u id是优惠券链接到的business.business\u id 我想得到所有的优惠券,足够接近(20公里)的用户位置 以下SQL代码为我提供了此范围内的业务:

我有两张桌子:

1. Coupons with columns {id, business_id, name}
2. Businesses with columns {business_id, name, latitude, longitude}
一般来说,这是一个优惠券管理网站,每家企业都可以提供优惠券

优惠券.business\u id
是优惠券链接到的business.business\u id

我想得到所有的优惠券,足够接近(20公里)的用户位置

以下SQL代码为我提供了此范围内的业务

注:lat和lng是用户的经度和纬度

我得到以下错误:

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
Hibernate:SELECT*FROM-coups-internal-join-business-on-coups.business\u-id=business.business\u-id((acos(sin((33.207933*pi()/180))*sin((business.lation`*pi()/180))*cos((35.570246-`business.longitude`*pi()/180))*180/pi())*60*1.1515)距离小于20个数量级的距离
2013年12月24日下午12:36:31 org.apache.catalina.core.StandardWrapperValve
严重:路径为[/InternetProject]的上下文中Servlet[jsp]的Servlet.service()引发了异常[org.hibernate.exception.sqlgrammareexception:无法执行查询],其根本原因是

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在第1行使用near“as distance have distance have distance<20 ORDER BY distance”的正确语法

我的第二个查询中出现了什么问题?如何解决?提前谢谢。。使用mySQL。

您混淆了内部join和select语句。试试这个:

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";
String query=“选择*,((acos(sin)(“+lat+”*pi()/180))*”
+“sin((`business.latitude`*pi()/180))+cos(“+lat+”*pi()/180))*”
+“cos((`business.latitude`*pi()/180))*cos(((“+lng+”-`business.longitude`)*”
+“pi()/180)))*180/pi())*60*1.1515”+
)作为与优惠券的距离,内部连接优惠券上的业务。business\u id=距离小于20的业务;

您的SQL语句已中断

它需要看起来像这样

SELECT *, 
       [domaths] AS distance 
FROM   table 
       INNER JOIN other_table 
               ON id = id 
你试过这个吗

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; 

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:field list@user1798362中的未知列“business.latitude”在
business
表中是否有
latitude
列?为什么在SQL表达式中进行如此复杂的计算?我认为如果你把计算放在一个函数中或在接收程序中进行计算会更好(更易于维护,更容易理解)。如果我是你,我会把哈弗森的部分封装在一个自定义函数中——为了可读性,我也考虑过,但我不知道怎么做
SELECT *, 
       [domaths] AS distance 
FROM   table 
       INNER JOIN other_table 
               ON id = id 
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;