Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Benötigen Sie die Hilfe eines Experten, um geringfügige Änderungen bei der Geodatenabfrage zu lösen

Mir scheint, Sie gehen davon aus, sobald Sie z.id ausgewählt haben in der Abfrage, dass Sie dadurch direkten Zugriff auf x(property) erhalten und y(property)

(Nebenbei – haben diese Namen wirklich Klammern in sich?)

Für mich sieht es so aus, als sollten Sie Dinge ersetzen wie

* COS(RADIANS(z.(x(property))))

mit so etwas wie

* COS(RADIANS( select x(property) from mytable where id = z.id ))

Wenn ich jedoch weiter darüber nachdenke, denke ich, dass Ihre mytable hat nicht die erforderliche Struktur. Wenn ich mir den Link ansehe, glaube ich, dass Ihr mytable sollte eher wie folgt aufgebaut sein:

+-----------+----------------+
| Field     |    Type        |
+-----------+----------------+
|  id       |        Int(10) |
| latitude  |        Float   |
| longitude |        Float   |
+-----------+----------------+

Damit Sie so etwas tun können wie

* COS(RADIANS(z.latitude))

HINWEIS

Das Obige basierte darauf, dass ich nicht verstanden habe, dass MySQL räumliche Datentypen unterstützt (für die ich keine Ahnung habe, wie man sie verwendet)

Aktualisieren

Ich habe gerade etwas gegoogelt, um die räumlichen Typen zu verstehen, und Folgendes gefunden:

Wie verwenden Sie räumliche MySQL-Abfragen, um alle Datensätze in X Radius zu finden? [geschlossen]

was darauf hindeutet, dass Sie nicht können tun, was Sie mit räumlichen Datentypen in mysql tun möchten. Das bringt Sie zurück zu einer nicht optimalen Art, Daten in mutable zu speichern

Beim erneuten Lesen dieses Links deuten die Kommentare zur Antwort jedoch darauf hin, dass Sie jetzt möglicherweise räumliche Datentypen verwenden können. (Ich habe Ihnen gesagt, dass ich hier keine Ahnung habe) Dies würde bedeuten, den Abfragecode durch Dinge wie ST_Distance(g1,g2) zu ersetzen , was effektiv bedeutet, das Beispiel komplett neu zu schreiben.

Anders ausgedrückt

Aktualisierung 2

Es gibt drei Pfade, denen Sie folgen können:

  1. Leugnen Sie, dass räumliche Datentypen in MySQL existieren, und verwenden Sie eine Tabelle, die explizite Spalten für lat enthält und long , und verwenden Sie den Beispielcode, wie er ursprünglich in diesem Blog geschrieben wurde.

  2. Nehmen Sie die räumlichen Datentypen von MySQL (Warzen und alle) an und werfen Sie einen Blick auf Dinge wie diese Antwort https:/ /stackoverflow.com/a/21231960/31326 die scheinbar direkt mit räumlichen Datentypen das tun, was Sie wollen, aber wie in dieser Antwort erwähnt, gibt es einige Vorbehalte.

  3. Verwenden Sie einen räumlichen Datentyp, um Ihre Daten zu speichern, und verwenden Sie eine pre-query um lat zu extrahieren und long bevor es an den ursprünglichen Beispielcode übergeben wird.