sql >> Database teknologi >  >> RDS >> Mysql

Har brug for eksperthjælp til at løse mindre ændringer i geografiske dataforespørgsler

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:

  1. Afvis, at der findes geodatatyper i MySQL, og brug en tabel, der har eksplicitte kolonner for lat og long , og brug prøvekoden som oprindeligt skrevet på den blog.

  2. 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.

  3. Brug en rumlig type til at opbevare dine data, og brug en pre-query at udtrække lat og long før den overføres til den originale prøvekode.



  1. Omdøb en kolonne i mysql-tabel uden at skulle gentage dens typedefinition

  2. Brugerdefineret ORDER BY for at ignorere 'den'

  3. Fuldtekst søgerelevans måles i?

  4. GROUP og COUNT() aldre i CakePHP