Mysql
 sql >> Base de données >  >> RDS >> Mysql

Besoin de l'aide d'un expert pour résoudre un changement mineur dans la requête de données spatiales

Il me semble que vous supposez qu'une fois que vous avez sélectionné z.id dans la requête, que cela vous donne un accès direct au x(property) et y(property)

(À part - ces noms ont-ils vraiment des parenthèses ?)

Donc, pour moi, il semble que vous devriez remplacer des choses comme

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

avec quelque chose comme

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

Cependant, en y réfléchissant davantage, je pense que votre mytable n'a pas la structure requise. En regardant le lien, je crois que votre mytable devrait avoir une structure plus comme :

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

Pour que vous puissiez faire quelque chose comme

* COS(RADIANS(z.latitude))

REMARQUE

Ce qui précède était basé sur le fait que je ne comprenais pas que MySQL prend en charge les types de données spatiales (pour lesquels je ne sais pas comment utiliser)

Mettre à jour

Je viens de faire quelques recherches sur Google pour comprendre les types spatiaux et j'ai trouvé ceci :

Comment utilisez-vous les requêtes spatiales MySQL pour trouver tous les enregistrements dans le rayon X ? [fermé]

ce qui suggère que vous ne pouvez pas faites ce que vous voulez faire avec les types de données spatiales dans mysql. Ce qui vous ramène donc à l'utilisation d'une manière non optimale de stocker les données dans mutable

Cependant, en relisant ce lien, les commentaires de la réponse suggèrent que vous pouvez désormais utiliser des types de données spatiales. (Je vous ai dit que je n'avais aucune idée ici) Cela signifierait remplacer le code de requête par des choses comme ST_Distance(g1,g2) , ce qui signifie en fait une réécriture totale de l'exemple.

Autrement dit

mise à jour 2

Vous pouvez suivre trois chemins :

  1. Nier que les types de données spatiales existent dans MySQL et utiliser une table qui a des colonnes explicites pour lat et long , et utilisez l'exemple de code tel qu'il a été écrit à l'origine sur ce blog.

  2. Adoptez les types de données spatiales MySQL (verrues et tout) et jetez un œil à des choses comme cette réponse https:/ /stackoverflow.com/a/21231960/31326 qui semblent faire ce que vous voulez directement avec les types de données spatiales, mais comme indiqué dans cette réponse, il y a quelques mises en garde.

  3. Utilisez un type spatial pour stocker vos données et utilisez une pre-query pour extraire lat et long avant de le passer dans l'exemple de code d'origine.