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:
-
Leugnen Sie, dass räumliche Datentypen in MySQL existieren, und verwenden Sie eine Tabelle, die explizite Spalten für
lat
enthält undlong
, und verwenden Sie den Beispielcode, wie er ursprünglich in diesem Blog geschrieben wurde. -
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.
-
Verwenden Sie einen räumlichen Datentyp, um Ihre Daten zu speichern, und verwenden Sie eine
pre-query
umlat
zu extrahieren undlong
bevor es an den ursprünglichen Beispielcode übergeben wird.