sql >> Database >  >> RDS >> Mysql

mysql join-tabel op zichzelf

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"

Bewerken

...om dit te gebruiken als basis voor yr lat/long calc, kunt u een tijdelijke tabel maken, of de resultaten inline gebruiken met een query vergelijkbaar met de (vereenvoudigde DISTANCE calc) hieronder

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. misschien wilt u een grof filter toepassen op uw lat/long-resultaten voordat u de 'dure' lat/long-berekening op de resultaten uitvoert, of voordat u deze opslaat in een tijdelijke tabel. Het idee zou zijn om alle r1-resultaten duidelijk buiten een straal van 10 mijl te negeren.

Als u een tijdelijke tabel gebruikt, is deze specifiek voor de gebruikerssessie.

Bewerk 2

Kijk eens naar Vorm van de aarde voor details, maar in wezen is 7 minuten breedte- en lengtegraad altijd groter dan 10 mijl, dus als uw breedte- en lengtegraden worden geregistreerd in graden, is dit 0,117 dichtbij genoeg. Elk punt dat meer dan 0,117 van uw doel afwijkt, mag niet binnen uw straal van 10 mijl liggen. Dit betekent dat u de r1-tabel als volgt kunt filteren:

(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. Als uw gegevens de meridiaan van Greenwich, de internationale datumgrens of de evenaar overspannen, is dit niet strikt correct. Ervan uitgaande dat al je lat/longs voor Noord-Amerika zijn, is dat geen probleem.



  1. Kan ik een atomaire toename in Rails 2.3 doen zonder terug te vallen op SQL?

  2. tomcat + mysql + war met behulp van docker-compose.yml

  3. ingevoerde formuliergegevens worden niet opgeslagen in mysql db?

  4. Hoe queryresultaten voor oneindig scrollen te pagineren?