#mysql
#mysql
Вопрос:
Я работаю с 2 таблицами. location
и us_zipcodes
.
location
содержит координаты пользователя и скорость перемещения.
us_zipcodes
содержит все города, их почтовые индексы и координаты в США.
Цель здесь — вернуть пользователям широту, долготу, скорость и ближайший город.
В моем select я пытаюсь вернуть 2 столбца из us_zipcodes
в подзапросе select. Я понимаю, что можно было бы рекомендовать объединение, но мои обстоятельства не позволяют ON
.
Подзапрос выбирает город на основе координат пользователей, которые наиболее близки к координатам города в us_zipcodes
таблице.
Я хочу знать, возможно ли то, что я хочу сделать, и если да, то правильный синтаксис.
Моя попытка приведена ниже. Заранее благодарю вас.
SELECT
l.lat,
l.lng,
l.speed
(
SELECT
CONCAT(city, ' ', state_abrv) AS nearest,
(
3959 *
acos(
cos( radians( l.lat ) ) *
cos( radians( lat ) ) *
cos(
radians( lng ) -
radians( l.lng )
)
sin( radians( l.lat ) ) *
sin( radians( lat ) )
)
) AS distance
FROM
us_zipcodes
ORDER BY
distance ASC
LIMIT 0, 1
) AS nearest, distance
FROM
location AS l
WHERE
l.userID = :userID
РЕДАКТИРОВАТЬ: структура моей таблицы такая, как показано.
ТАБЛИЦА: location
ID | lat | lng | speed | userID
___________________________________________________________________________________
1 | 55.159399 | -74.98976 | 35 | 1
2 | 45.168399 | -52.56476 | 45 | 2
3 | 64.593399 | -64.32576 | 55 | 3
4 | 98.193399 | -72.81176 | 65 | 4
ТАБЛИЦА: us_zipcodes
ID | city | state_abrv | lat | lng
______________________________________________________________________________________
1 | Foo City | MI | 45.3265 | -81.98747
2 | Bar City | AK | 65.3265 | -65.98747
3 | Fake City | FL | 25.3265 | -75.98747
4 | Smith City | MI | 64.3265 | -89.98747
Комментарии:
1. не могли бы вы предоставить свою структуру таблицы
2. мои обстоятельства не позволяют
ON
. Почему бы и нет?3. Потому что в двух таблицах нет общих столбцов. Ссылки нет. Выбор во внутреннем соединении основан на ближайших координатах по сравнению с широтой и lng внешнего запроса.
Ответ №1:
Может быть, что-то вроде этого может помочь
SELECT
state_abrv,
city,
3959 * acos(
cos( radians( (SELECT lat FROM location WHERE userID = :userID) ) ) *
cos( radians( lat ) ) *
cos(
radians( lng ) -
radians( (SELECT lng FROM location WHERE userID = :userID) )
)
sin( radians( (SELECT lat FROM location WHERE userID = :userID) )) *
sin( radians( lat ) )
) AS distanse,
(SELECT lng FROM location WHERE userID = :userID) as lng,
(SELECT lat FROM location WHERE userID = :userID) as lat,
(SELECT speed FROM location WHERE userID = :userID) as speed
FROM us_zipcodes ORDER BY distanse LIMIT 1;
или только два отдельных подзапроса
SELECT
l.lat,
l.lng,
l.speed,
(SELECT (3959 * acos(
cos(radians(l.lat)) *
cos(radians(lat)) *
cos(radians(lng)-radians(l.lng))
sin(radians(l.lat)) *
sin(radians(lat)))
)
FROM us_zipcodes
ORDER BY distance ASC
LIMIT 0, 1
) AS distance,
(SELECT CONCAT(city, ' ', state_abrv)
FROM us_zipcodes
WHERE 3959 *
acos(cos(radians(l.lat)) * cos(radians(lat)) *
cos( radians(lng) - radians(l.lng))
sin(radians(l.lat)) *
sin(radians(lat))
) = distance) AS nearest
FROM
location AS l
WHERE
l.userID = :userID;