Mysql
 sql >> Database >  >> RDS >> Mysql

mysql join table su se stesso

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"

Modifica

...per utilizzare questo come base per yr lat/long calc, puoi creare una tabella temporanea o utilizzare i risultati in linea con una query simile al (calcolo DISTANZA semplificato) di seguito

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. potresti voler applicare un filtro approssimativo ai tuoi risultati lat/long prima di eseguire il calcolo lat/long "costoso" sui risultati o prima di archiviarli in una tabella temporanea. L'idea sarebbe di ignorare tutti i risultati r1 chiaramente al di fuori di un raggio di 10 miglia.

Se utilizzi una tabella temporanea, sarà specifica per la sessione dell'utente.

Modifica 2

Dai un'occhiata a Forma della Terra per i dettagli, ma essenzialmente 7 minuti di latitudine e longitudine sono sempre maggiori di 10 miglia, quindi se la tua latitudine e longitudine sono registrate in gradi questo è 0,117 abbastanza vicino. Qualsiasi punto che differisca di oltre 0,117 dal tuo obiettivo non può trovarsi all'interno del tuo raggio di 10 miglia. Ciò significa che puoi filtrare la tabella r1 come :

(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 i tuoi dati si estendono sul meridiano di Greenwich, sulla linea della data internazionale o sull'equatore, ciò non sarà del tutto corretto. Supponendo che tutti i tuoi lat/long siano per il Nord America, non sarà un problema.