Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql Join-Tabelle auf sich selbst

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"

Bearbeiten

...um dies als Grundlage für die Berechnung von Längen-/Breitengraden im Jahr zu verwenden, können Sie entweder eine temporäre Tabelle erstellen oder die Ergebnisse inline mit einer Abfrage ähnlich der (vereinfachten DISTANZ-Berechnung) unten verwenden

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. Möglicherweise möchten Sie einen groben Filter auf Ihre Lat/Long-Ergebnisse anwenden, bevor Sie die „teure“ Lat/Long-Berechnung der Ergebnisse durchführen oder bevor Sie sie in einer temporären Tabelle speichern. Die Idee wäre, alle r1-Ergebnisse eindeutig außerhalb eines 10-Meilen-Radius zu ignorieren.

Wenn Sie eine temporäre Tabelle verwenden, ist diese benutzersitzungsspezifisch.

Bearbeiten 2

Sehen Sie sich Shape of the Earth an für Details, aber im Wesentlichen sind 7 Minuten Breite und Länge immer größer als 10 Meilen, wenn also Ihre Breiten- und Längengrade in Grad aufgezeichnet werden, ist dies 0,117 nahe genug. Jeder Punkt, der um mehr als 0,117 von Ihrem Ziel abweicht, darf nicht innerhalb Ihres 10-Meilen-Radius liegen. Das bedeutet, dass Sie die r1-Tabelle wie folgt filtern können:

(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. Wenn sich Ihre Daten über den Meridian von Greenwich, die internationale Datumsgrenze oder den Äquator erstrecken, ist dies nicht ganz korrekt. Angenommen, alle Ihre Breiten-/Längengrade sind für Nordamerika bestimmt, ist das kein Problem.