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

时间:2013-12-11 21:07:51

标签: java sql

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

  1. 业务。
  2. 优惠券
  3. Businesses中的每一行都包含以下字段:

    {iddetailsimagenamelocation_xlocation_y},

    其中location_xlocation_y是Google地图的latituelongitue坐标。

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

    {idbusiness_idimagedetailsgoneDategoneHour}。

    id是优惠券id

    business_id是此优惠券所属的id的{​​{1}}。

    我的问题:

    通过查询business,如何从指定的坐标中获取其所有者营业地点半径小于Coupons的所有优惠券?

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

    如何获取每个优惠券业务ID,然后转到业务表,并检查该业务ID位置的半径是否距离指定位置不到10公里?

    我认为它与10km有关,不确定。

    我在Java中使用hibernate框架。

    请提前帮助我!

3 个答案:

答案 0 :(得分:1)

这可以用数学来完成!
首先我们知道给定Point P(x, y)
P位于Circle Center C(a,b)Radius r

之内

如果它满足等式(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_x以及r is the radius = 10中。查询假设地球的半径为6371公里。

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

答案 1 :(得分:0)

我认为这不能仅在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 :(得分:0)

您必须使用公式计算距离。这里有一个问题的答案:Finding a geography point within a range of another - SQL Server