sql >> Database >  >> RDS >> Mysql

Hulp van een expert nodig om een ​​kleine wijziging in het zoeken naar ruimtelijke gegevens op te lossen

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:

  1. Ontken dat typen ruimtelijke gegevens in MySQL bestaan ​​en gebruik een tabel met expliciete kolommen voor lat en long , en gebruik de voorbeeldcode zoals oorspronkelijk op die blog geschreven.

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

  3. Gebruik een ruimtelijk type om uw gegevens te bewaren en gebruik een pre-query om lat te extraheren en long voordat u het in de originele voorbeeldcode doorgeeft.



  1. Werk je alleen de gewijzigde velden bij of alle velden?

  2. Geldige tijdreeksindelingen voor SQLite-datum-/tijdfuncties

  3. Lokale replica van RDS-database

  4. Verbinding met Db sterft na>4<24 in spring-boot jpa-slaapstand