Det forekommer mig, at du antager det, når du først har valgt z.id
i forespørgslen, at dette giver dig direkte adgang til x(property)
og y(property)
(Bortset - har de navne virkelig parenteser i dem?)
Så for mig ser det ud til, at du bør erstatte ting som
* COS(RADIANS(z.(x(property))))
med noget lignende
* COS(RADIANS( select x(property) from mytable where id = z.id ))
Men ved at tænke videre over det, tror jeg, at din mytable
ikke har den nødvendige struktur. Ud fra at se på linket tror jeg, at din mytable
bør have en struktur mere som:
+-----------+----------------+
| Field | Type |
+-----------+----------------+
| id | Int(10) |
| latitude | Float |
| longitude | Float |
+-----------+----------------+
Så du kan gøre sådan noget som
* COS(RADIANS(z.latitude))
BEMÆRK
Ovenstående var baseret på, at jeg ikke forstod, at MySQL understøtter geografiske datatyper (som jeg ikke aner, hvordan man bruger)
Opdater
Jeg har lige googlet lidt for at forstå de rumlige typer og fandt dette:
Hvordan bruger du MySQL rumlige forespørgsler til at finde alle poster i X-radius? [lukket]
hvilket tyder på, at du ikke kan gør hvad du vil med rumlige datatyper i mysql. Hvilket dermed bringer dig tilbage til at bruge en ikke-optimal måde at gemme data på i mutable
Men når du genlæser det link, tyder kommentarerne til svaret på, at du nu muligvis kan bruge geografiske datatyper. (Jeg fortalte dig, at jeg ikke havde en anelse her) Dette ville betyde at erstatte forespørgselskoden med ting som ST_Distance(g1,g2)
, hvilket reelt betyder fuldstændig omskrivning af eksemplet.
For at sige det på en anden måde
opdatering 2
Der er tre veje, du kan følge:
-
Afvis, at der findes geodatatyper i MySQL, og brug en tabel, der har eksplicitte kolonner for
lat
oglong
, og brug prøvekoden som oprindeligt skrevet på den blog. -
Omfavn MySQL rumlige datatyper (vorter og det hele), og tag et kig på ting som dette svar https:/ /stackoverflow.com/a/21231960/31326 der ser ud til at gøre, hvad du vil, direkte med geografiske datatyper, men som nævnt i det svar er der nogle forbehold.
-
Brug en rumlig type til at opbevare dine data, og brug en
pre-query
at udtrækkelat
oglong
før den overføres til den originale prøvekode.