我有一个包含2个表的数据库:
Businesses
中的每一行都包含以下字段:
{id
,details
,image
,name
,location_x
,location_y
},
其中location_x
和location_y
是Google地图的latitue
和longitue
坐标。
在Coupons
表中,每一行都包含以下字段:
{id
,business_id
,image
,details
,goneDate
,goneHour
}。
id
是优惠券id
,
和business_id
是此优惠券所属的id
的{{1}}。
通过查询business
,如何从指定的坐标中获取其所有者营业地点半径小于Coupons
的所有优惠券?
或换句话说,就是这样的人:
如何获取每个优惠券业务ID,然后转到业务表,并检查该业务ID位置的半径是否距离指定位置不到10公里?
我认为它与10km
有关,不确定。
我在Java中使用hibernate框架。
请提前帮助我!
答案 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_y
和b 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