Подзапрос MySQL в select возвращает несколько столбцов

#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;