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

mysql junta-se à tabela em si mesmo

select t1.post_id, t1.meta_value as lat, t2.meta_value as lon
from metatdatatable t1, metadatatable t2
where t1.meta_key = "_wp_field1"
and t2.post_id = t1.post_id
and t2.meta_key = "_wp_field2"

Editar


...para usar isso como base para yr lat/long calc, você pode criar uma tabela temporária ou usar os resultados em linha com uma consulta semelhante à (DISTANCE calc simplificada) abaixo
select d1.post_id, d1.distance
from
(select r1.post_id, ABS($lat - r1.lat) + ABS($lon - r1.lon) as DISTANCE
from (select t1.post_id, t1.meta_value as lat, t2.meta_value as lon
    from metatdatatable t1, metadatatable t2
    where t1.meta_key = "_wp_field1"
    and t2.post_id = t1.post_id
    and t2.meta_key = "_wp_field2") as r1
) as d1
where d1.distance <= 10
order by d1.distance ASC

NB. você pode querer aplicar um filtro aproximado aos seus resultados de latitude/longitude antes de fazer o cálculo 'caro' de latitude/longitude nos resultados ou antes de armazenar em uma tabela temporária. A ideia seria ignorar todos os resultados de r1 claramente fora de um raio de 10 milhas.

Se você usar uma tabela temporária, ela será específica da sessão do usuário.

Editar 2


Dê uma olhada em Forma da Terra para detalhes, mas essencialmente 7 minutos de latitude e longitude é sempre maior que 10 milhas, portanto, se suas latitudes e longitudes forem registradas em graus, isso será 0,117 próximo o suficiente. Qualquer ponto que difira mais de 0,117 do seu alvo não pode estar dentro do seu raio de 10 milhas. Isso significa que você pode filtrar a tabela r1 como:
(select t1.post_id, t1.meta_value as lat, t2.meta_value as lon
        from metatdatatable t1, metadatatable t2
        where t1.meta_key = "_wp_field1"
        and t2.post_id = t1.post_id
        and t2.meta_key = "_wp_field2"
        and ABS(t2.meta_value - $lon) < 0.117
        and ABS(t1.meta_value - $lat) < 0.117
) as r1  

NB. Se seus dados abrangerem o Meridiano de Greenwich, Linha Internacional de Data ou Equador, isso não será estritamente correto. Supondo que todos os seus lat/longs sejam para a América do Norte, não será um problema.