sql >> Base de Datos >  >> RDS >> Mysql

Necesita la ayuda de un experto para resolver un cambio menor en la consulta de datos espaciales

Me parece que está asumiendo que una vez que haya seleccionado z.id en la consulta, que esto le da acceso directo a la x(property) y y(property)

(Aparte, ¿esos nombres realmente tienen paréntesis entre ellos?)

Entonces, para mí, parece que deberías reemplazar cosas como

* COS(RADIANS(z.(x(property))))

con algo como

* COS(RADIANS( select x(property) from mytable where id = z.id ))

Sin embargo, pensando más en ello, creo que su mytable no tiene la estructura requerida. Al mirar el enlace, creo que su mytable debería tener una estructura más como:

+-----------+----------------+
| Field     |    Type        |
+-----------+----------------+
|  id       |        Int(10) |
| latitude  |        Float   |
| longitude |        Float   |
+-----------+----------------+

Para que puedas hacer algo como

* COS(RADIANS(z.latitude))

NOTA

Lo anterior se basó en que no entendí que MySQL admite tipos de datos espaciales (para los cuales no tengo idea de cómo usarlos)

Actualizar

Acabo de buscar en Google para entender los tipos espaciales y encontré esto:

¿Cómo se utilizan las consultas espaciales de MySQL para encontrar todos los registros en el radio X? [cerrado]

lo que sugiere que no puedes haga lo que quiera hacer con los tipos de datos espaciales en mysql. Lo que lo lleva de nuevo a usar una forma no óptima de almacenar datos en mutable

Sin embargo, al volver a leer ese enlace, los comentarios a la respuesta sugieren que ahora puede usar tipos de datos espaciales. (Te dije que no tenía ni idea aquí) Esto significaría reemplazar el código de consulta con cosas como ST_Distance(g1,g2) , lo que efectivamente significa reescribir totalmente el ejemplo.

Para decirlo de otra manera

actualización 2

Hay tres caminos que puedes seguir:

  1. Negar que existan tipos de datos espaciales en MySQL y usar una tabla que tenga columnas explícitas para lat y long y use el código de muestra como se escribió originalmente en ese blog.

  2. Adopte los tipos de datos espaciales de MySQL (verrugas y todo) y observe cosas como esta respuesta https:/ /stackoverflow.com/a/21231960/31326 que parecen hacer lo que usted quiere directamente con los tipos de datos espaciales, pero como se indica en esa respuesta, hay algunas advertencias.

  3. Use un tipo espacial para almacenar sus datos y use una pre-query para extraer lat y long antes de pasarlo al código de muestra original.