3 Stimmen

Wie kann man mit SQL eine Eins-zu-viele-Beziehung auswählen und die Ausgabe zusammenführen?

Dies wurde drastisch aktualisiert, seit ich der Lösung näher gekommen bin

Ich glaube, der Titel ist nicht der beste, aber ich wusste nicht, wie ich es besser erklären sollte.

Ich habe Orte mit Koordinaten in zwei Bezugstabellen. Tabelle locations(id, name, description, created_at) y locations_coordinates(location_id, lat, lng, coordinates_order) .

Ich speichere eine unbekannte Anzahl von Koordinaten (ein Polygon), weshalb ich zwei Tabellen verwende.

Jetzt führe ich die folgende Abfrage aus

SELECT l.id, 
   l.name, 
   l.description, 
   l.created_at, 
   GROUP_CONCAT(Concat(c.lat, ":", c.lng) ORDER BY c.coordinate_order ASC 
   SEPARATOR 
   ', ') AS coordinates 
FROM   locations l 
   LEFT JOIN locations_coordinates c 
     ON l.id = c.location_id 
WHERE  l.id = ' . $id . ' 
GROUP  BY l.id, 
      l.name, 
      l.description, 
      l.created_at ASC 

Ich erhalte also folgende Ausgabe (mit id = 3) :

[
{
  "id":"3",
  "name":"Stadthalle",
  "description":"Die Wiener Stadthalle",
  "created_at":"2012-01-07 14:22:06",
  "coordinates":"48.201187:16.334213, 48.200665:16.331606, 48.202989:16.331091,     48.203075:16.334192"
}
] 

Ich möchte die Breiten- und Längengradpaare zusammen erhalten, etwa so:

[
{
  "id":"3",
  "name":"Stadthalle",
  "description":"Die Wiener Stadthalle",
  "created_at":"2012-01-07 14:22:06",
  "coordinates":[
     [
        "48.201187,16.334213"
     ],
     [
        "48.200665,16.331606"
     ],
     [
        "48.202989,16.331091"
     ],
     [
        "48.203075,16.334192"
     ]
  ]
}
]

Meine Frage lautet also: Gibt es eine Möglichkeit, die benötigte Ausgabe nur mit SQL zu erhalten? Wenn nicht, kann meine Abfrage verbessert werden, so dass ich es einfacher habe, es mit Anwendungscode zu tun (PHP für mich)?

UPDATE:

Ich benutze MyISAM und in der Tabelle "locations_coordinates" sind "locations_id" und "coordinates_order" PRIMÄRES und "coordinates_order" ist eingestellt auf AUTOMATISCHE ERHÖHUNG so dass beim Einfügen immer eine neue Reihe von Ordnungsnummern beginnt. (Ich brauche das, damit ich später die Koordinaten in der richtigen Reihenfolge auswählen kann).

0voto

Philip Punkte 4606

Solange Sie Fremdschlüssel einrichten (ggf. mehrere), aber stellen Sie sicher, dass Sie die Schlüssel für mehr Geschwindigkeit indizieren.

dann sicher, dass Sie mehrere Verknüpfungen wie Sie oben erwähnen, tun können, solange Orte und Koordinaten den Fremdschlüssel user.id haben

Ich habe vor ein paar Tagen eine ähnliche Frage beantwortet (lustigerweise hatte sie mit Standorten/Koordinaten zu tun), leider kann ich heute Abend nicht auf irgendwelche Links klicken, um Sie weiterzuleiten, vielleicht können Sie mein Profil durchsuchen.

0voto

itea Punkte 444

Ich löse ähnliche Probleme auf diese Weise:

Zunächst werden alle benötigten Ortsdatensätze ermittelt und in eine Hash-Map mit der ID als Schlüssel eingefügt.

Zweitens werden alle Koordinatendatensätze ermittelt, bei denen location_id in location records id enthalten ist. Vielleicht: select * from coordinate where location_id in (?, ?, ...)

Drittens: Iterieren Sie die Koordinatendatensätze und tragen Sie die Spalten lat und lng in den entsprechenden Ortsdatensatz ein.

Wenn die Größe der Ortsdatensätze nicht zu groß ist, sind nur zwei SQL-Anweisungen erforderlich. Dadurch erhalten wir eine bessere Leistung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X