帮助构建查询以按距离列出音乐会/场地

时间:2011-01-02 12:21:10

标签: sql join structure distance

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

2 个答案:

答案 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是当前登录用户的经度和纬度! 这将选择在每个场地发生的每一个演出,并按距离的顺序排列