Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Precisa da ajuda de um especialista para resolver pequenas alterações na consulta de dados espaciais


Parece-me que você está assumindo que depois de selecionar z.id na consulta, que isso lhe dá acesso direto ao x(property) e y(property)

(À parte - esses nomes realmente têm parênteses?)

Então, para mim, parece que você deve substituir coisas como
* COS(RADIANS(z.(x(property))))

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

No entanto, pensando melhor sobre isso, acho que sua mytable não tem a estrutura necessária. Olhando para o link, acredito que sua mytable deveria ter uma estrutura mais parecida com:
+-----------+----------------+
| Field     |    Type        |
+-----------+----------------+
|  id       |        Int(10) |
| latitude  |        Float   |
| longitude |        Float   |
+-----------+----------------+

Para que você possa fazer algo como
* COS(RADIANS(z.latitude))

OBSERVAÇÃO

O acima foi baseado em não entender que o MySQL suporta tipos de dados espaciais (para os quais não tenho ideia de como usar)

Atualizar

Acabei de pesquisar no Google para entender os tipos espaciais e encontrei isso:

Como você usa consultas espaciais do MySQL para encontrar todos os registros no raio X? [fechado]

o que sugere que você não pode faça o que você quer fazer com tipos de dados espaciais no mysql. Assim, você volta a usar uma maneira não ideal de armazenar dados em mutable

No entanto, ao reler esse link, os comentários da resposta sugerem que agora você pode usar tipos de dados espaciais. (Eu disse que não tinha a menor idéia aqui) Isso significaria substituir o código de consulta por coisas como ST_Distance(g1,g2) , o que efetivamente significa reescrever totalmente o exemplo.

Para colocar de outra forma

atualização 2

Existem três caminhos que você pode seguir:

  1. Negue a existência de tipos de dados espaciais no MySQL e use uma tabela que tenha colunas explícitas para lat e long e use o código de exemplo originalmente escrito nesse blog.

  2. Abrace os tipos de dados espaciais do MySQL (verrugas e tudo) e dê uma olhada em coisas como esta resposta https:/ /stackoverflow.com/a/21231960/31326 que parecem fazer o que você deseja diretamente com tipos de dados espaciais, mas, conforme observado nessa resposta, há algumas ressalvas.

  3. Use um tipo espacial para armazenar seus dados e use uma pre-query para extrair lat e long antes de passá-lo para o código de amostra original.