SQL noob需要一些帮助。我已经知道如何在PHP / SQL中执行此操作,但我真的想将其压缩为一个SELECT语句。 OK:
我正在制作的网站是一系列音乐会和场地。场地具有纬度和经度,对应于该用户位置的帐户也是如此。
我有三张桌子,帐户(用户),音乐会,我想选择一个音乐会列表(并加入该信息的场地),这些音乐会发生在帐户x英里内的场地,使用这个便宜的公式距离计算(该网站仅列出英国的场地,因此错误是可以接受的):
x = 69.1 *(accountLatitude - venueLatitude);
y = 69.1 *(accountLongitude - venueLongitude)* cos(venueLatitude / 57.3);
距离= sqrt(x * x + y * y);
如何在单个查询中实现此目的?
先谢谢xD
答案 0 :(得分:0)
这完全按照公式建议完成。
只需将x和y替换为距离公式。
如果这是针对MySQL的,那么下面应该可以工作(只需要替换正确的表名/列名)。
SELECT concert.name, venue.name,
SQRT(POW(69.1 * (account.Latitude - venue.Latitude), 2) + POW(69.1 * (account.Longitude - venue.Longitude) * cos(venue.Latitude / 57.3), 2)) AS distance
FROM account, venue
LEFT JOIN concert ON conert.ID = venue.concertID
WHERE account.id = UserWhoIsLoggedIn
ORDER BY 3;
这应该返回所有音乐会名称,地点名称和距离用户订单的距离。
如果您不使用MySQL,则可能需要更改POW或SQRT功能。
还要注意罪与罪cos函数在Radians中输入。
答案 1 :(得分:0)
对于每个人来说,现在我最终做到了这一点:
$q = 'SELECT gigs.date, bands.idbands, venues.latitude, venues.longitude, venues.idvenues, bands.name AS band, venues.name AS venue,
SQRT(POW(69.1 * (' . $lat . ' - venues.latitude), 2) + POW(69.1 * (' . $lon . ' - venues.longitude) * cos(venues.latitude / 57.3), 2)) AS distance
FROM gigs
LEFT JOIN bands ON bands.idbands=gigs.bands_idbands
LEFT JOIN venues ON venues.idvenues=gigs.venues_idvenues
WHERE 1
ORDER BY distance';
其中$ lat和$ lon是当前登录用户的经度和纬度! 这将选择在每个场地发生的每一个演出,并按距离的顺序排列