Помогите составить запрос по списку концертов / мест по расстоянию - PullRequest
1 голос
/ 02 января 2011

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 голосов
/ 19 января 2011

Для всех остальных, вот теперь я сделал это в конце:

$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 - широта и долгота пользователя, вошедшего в систему!это выбирает каждый концерт, который происходит в каждом месте, и размещает их в порядке расстояния

0 голосов
/ 02 января 2011

Это сделано именно так, как предлагают ваши формулы.

Просто подставьте 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.

Также имейте в виду, что функции sin & cos принимают входные данные в радианах.

...