有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

依赖于2个表的java SQL查询?

我有一个包含2个表的数据库:

  1. 商业
  2. 优惠券

Businesses中的每一行都有以下字段:

{{},{},{},{},{},{}

其中location_xlocation_y是谷歌地图的latituelongitue坐标

Coupons表中,每一行都有以下字段:

{{},{},{},{},{},{}

id是优惠券id

business_id是该优惠券所属businessid

我的问题:

通过查询Coupons,我如何从给定坐标获得其所有者业务位置半径小于10km的所有优惠券

或者换句话说,就是这样的人:

如何获取每个优惠券业务id,然后转到业务表,并检查该业务id位置的半径是否小于给定位置10公里

我认为这与{}有关,不确定

我在Java的hibernate框架中工作

请帮帮我,提前谢谢


共 (3) 个答案

  1. # 1 楼答案

    我不认为单用SQL就可以做到这一点,因为您需要进行一些计算来计算出企业与给定位置之间的距离

    可行的方法是查询业务,计算所有偏差,扔掉10公里以上的偏差,然后查询优惠券

    SELECT * FROM coupons WHERE business_id IN {array of your <10km business ids}
    

    如果你只是想得到一个结果与优惠券匹配的企业内部加入将为你工作

    SELECT * FROM coupons INNER JOIN businesses ON coupons.business_id = businesses.id
    
  2. # 3 楼答案

    这可以通过数学来完成
    首先,我们知道给定一个Point P(x, y)
    P位于{}与{}和{}的{}内

    如果它满足方程(x-a)^2 + (y - b)^2 <= r^2

    因此,在你的例子中,中心将是提供的初始坐标

    为了获得给定半径范围内企业的所有优惠券,此查询应该做到这一点

    SELECT 
        bus.id, coup.id 
    FROM 
        Businesses AS bus INNER JOIN 
        Coupons AS coup 
    WHERE
        bus.id = coup.business_id AND
        (acos(sin(radians(business.location_y)) * sin(radians(a)) + cos(radians(business.location_y)) * cos(radians(a)) * cos(radians(business.location_x) - radians(b)) * 6371) <= 10;
    

    在上面的查询中a is input_yb is input_xr is the radius = 10。查询假设地球的半径为6371公里

    编辑:在与@acfrancis讨论后,我使用更适合于计算球体上点之间距离的公式重写了查询。这对于您的用例应该是可行的(即使地球不是完美的球体)。使用的所有函数都是postgres特有的。详情可参见此处http://en.wikipedia.org/wiki/Great-circle_distance