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

table de jointure mysql sur elle-même

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"

Modifier

... pour l'utiliser comme base pour le calcul lat/long an, vous pouvez soit créer une table temporaire, soit utiliser les résultats en ligne avec une requête similaire au (calcul DISTANCE simplifié) ci-dessous

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. vous voudrez peut-être appliquer un filtre grossier à vos résultats lat/long avant de faire le calcul lat/long "coûteux" sur les résultats, ou avant de les stocker dans une table temporaire. L'idée serait d'ignorer tous les résultats r1 clairement en dehors d'un rayon de 10 milles.

Si vous utilisez une table temporaire, elle sera spécifique à la session utilisateur.

Modifier 2

Jetez un œil à Forme de la Terre pour plus de détails, mais essentiellement 7 minutes de lat &longitude est toujours supérieure à 10 miles, donc si votre lat &longs sont enregistrés en degrés c'est 0,117 assez près. Tout point différant de plus de 0,117 de votre cible ne peut pas être à l'intérieur de votre rayon de 10 milles. Cela signifie que vous pouvez filtrer la table r1 comme :

(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. Si vos données couvrent le méridien de Greenwich, la ligne de date internationale ou l'équateur, cela ne sera pas strictement correct. En supposant que tous vos lat/longs sont pour l'Amérique du Nord, cela ne posera pas de problème.