2016-10-24 3 views
0

Ich arbeite mit 2 Tabellen. location und us_zipcodes.MySQL Unterabfrage in auswählen, mehrere Spalten zurückgeben

location enthält Benutzerkoordinaten und Fahrgeschwindigkeit.

us_zipcodes enthält alle Städte, ihre Postleitzahlen und Koordinaten in den USA.

Das Ziel hier ist, den Benutzern Breite, Länge, Geschwindigkeit und nächstgelegene Stadt zurückzugeben.

In meiner Auswahl versuche ich 2 Spalten von us_zipcodes in einer Select-Unterabfrage zurückzugeben. Ich verstehe, dass man eine Verbindung empfehlen könnte, aber meine Umstände erlauben keine ON.

Die Unterabfrage wählt die Stadt anhand der Benutzerkoordinaten aus, die den Koordinaten der Stadt in der Tabelle us_zipcodes am nächsten liegen.

Ich suche zu wissen, ob was ich tun möchte, und wenn ja, die richtige Syntax.

Mein Versuch ist unten. Vielen Dank im Voraus.

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 

EDIT: Meine Tabellenstruktur ist wie gezeigt.

TABLE: 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  

TABLE: 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 
+0

könnten Sie Ihre Tabellenstruktur – Beginner

+0

liefern * meine Umstände erlauben kein 'ON'. * Warum nicht? –

+0

Da in den beiden Tabellen keine Spalten geteilt werden. Es gibt keinen Link. Die Auswahl im inneren Join basiert auf den nächsten Koordinaten im Vergleich zum lat und lng der äußeren Abfrage. –

Antwort

0

Vielleicht wie etwas das

helfen kann
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; 

oder zwei separate Subqueries

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; 
Verwandte Themen