Het lijkt mij dat je ervan uitgaat dat als je eenmaal z.id
. hebt geselecteerd in de query, dat dit u directe toegang geeft tot de x(property)
en y(property)
(Terzijde - hebben die namen echt haakjes?)
Dus voor mij lijkt het erop dat je dingen als
. moet vervangen* COS(RADIANS(z.(x(property))))
met zoiets als
* COS(RADIANS( select x(property) from mytable where id = z.id ))
Maar als ik er verder over nadenk, denk ik dat je mytable
heeft niet de gewenste structuur. Als ik naar de link kijk, denk ik dat je mytable
zou een structuur moeten hebben als:
+-----------+----------------+
| Field | Type |
+-----------+----------------+
| id | Int(10) |
| latitude | Float |
| longitude | Float |
+-----------+----------------+
Zodat je iets kunt doen als
* COS(RADIANS(z.latitude))
OPMERKING
Het bovenstaande was gebaseerd op het feit dat ik niet begreep dat MySQL ruimtelijke gegevenstypen ondersteunt (waarvoor ik geen idee heb hoe ik ze moet gebruiken)
Bijwerken
Ik heb even gegoogeld om de ruimtelijke typen te begrijpen en vond dit:
Hoe gebruikt u ruimtelijke MySQL-query's om alle records in de X-straal te vinden? [gesloten]
wat suggereert dat je niet kunt doe wat u wilt doen met ruimtelijke gegevenstypen in mysql. Wat je dus terugbrengt naar het gebruik van een niet-optimale manier om gegevens op te slaan in mutable
Bij het herlezen van die link suggereren de opmerkingen bij het antwoord echter dat u nu mogelijk ruimtelijke gegevenstypen kunt gebruiken. (Ik zei toch dat ik hier geen idee van had) Dit zou betekenen dat de querycode moet worden vervangen door dingen als ST_Distance(g1,g2)
, wat in feite betekent dat het voorbeeld volledig wordt herschreven.
Om het anders te zeggen
update 2
Er zijn drie paden die u kunt volgen:
-
Ontken dat typen ruimtelijke gegevens in MySQL bestaan en gebruik een tabel met expliciete kolommen voor
lat
enlong
, en gebruik de voorbeeldcode zoals oorspronkelijk op die blog geschreven. -
Omarm de MySQL-typen ruimtelijke gegevens (wratten en zo) en bekijk dit soort dingen https:/ /stackoverflow.com/a/21231960/31326 die lijken te doen wat u wilt, rechtstreeks met typen ruimtelijke gegevens, maar zoals opgemerkt in dat antwoord zijn er enkele kanttekeningen.
-
Gebruik een ruimtelijk type om uw gegevens te bewaren en gebruik een
pre-query
omlat
te extraheren enlong
voordat u het in de originele voorbeeldcode doorgeeft.