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

mysql se une a la tabla en sí mismo

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 esto como base para el cálculo de latitud/longitud del año, puede crear una tabla temporal o usar los resultados en línea con una consulta similar al (cálculo de DISTANCIA simplificado) a continuación

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

NÓTESE BIEN. es posible que desee aplicar un filtro aproximado a sus resultados de latitud/longitud antes de realizar el cálculo 'caro' de latitud/longitud en los resultados, o antes de almacenarlos en una tabla temporal. La idea sería ignorar todos los resultados de r1 claramente fuera de un radio de 10 millas.

Si usa una tabla temporal, será específica de la sesión del usuario.

Editar 2

Eche un vistazo a Forma de la Tierra para más detalles, pero esencialmente 7 minutos de latitud y longitud siempre es mayor que 10 millas, por lo que si su latitud y longitud se registran en grados, esto es 0.117 lo suficientemente cerca. Cualquier punto que difiera en más de 0,117 de su objetivo no puede estar dentro de su radio de 10 millas. Esto significa que puede filtrar la tabla 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  

NÓTESE BIEN. Si sus datos abarcan el meridiano de Greenwich, la línea de cambio de fecha internacional o el ecuador, esto no será estrictamente correcto. Suponiendo que todas sus lat/longs sean para América del Norte, no será un problema.