2011-12-30 28 views
6

Sütun takma adımı (lat ve lng) iki alt sorgunun altından mesafe hesaplamasını yapmak için nasıl kullanabilirim? Temel olarak yapmaya çalıştığım şey, boylam ve enlem değerleri kullanılarak iki konum arasındaki mesafeyi hesaplamaktır. Ama bir şekilde benim takma adlarm sorguda kullanılamaz, neden? Eğer bir dize olarak başvurmak gerekir (eğer önce ve sonra tırnak eklemek gerekir) takma adınızı oluşturduktan sonraHesaplamalar için MySQL sütun takma adı nasıl kullanılır?

SELECT wp_posts.*, 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '41.%') AS lat, 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '2.%') AS lng, 
(3959 * acos(cos(radians(41.367682)) * cos(radians('lat')) * cos(radians('lng') -  radians(2.154077)) + sin(radians(41.367682)) * sin(radians('lat')))) AS distance 
FROM wp_posts, wp_postmeta 
WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'position' AND wp_posts.post_status = 'publish' AND wp_posts.post_type = 'page' AND wp_posts.post_date < NOW() 
GROUP BY ID 
ORDER BY distance ASC 
+1

İfadenize neden tırnak ve tırnak koymuyorsunuz? –

+0

Hata olmadan çalışıyor mu, yoksa bu sorguyu yürütürken bazı hatalar alıyor musunuz? – Lion

+0

Sorguyu çalıştırmak için tırnak işaretleri gerekiyor, hata alıyorum ve her şey doğru şekilde döndürülüyor, ancak mesafe hesaplaması tüm kayıtlar için aynı değeri döndürüyor, yani girilen değerler hiçbir şey için kullanılmıyor. Burada neyi yanlış yapıyorum? – Chris

cevap

4

Tamam, 'nEREDE şartlarını farklı kullanabilirsiniz çok farklı takma adlar altında iki kez aynı tablo (wp_postmeta) katılmak olduğunu. Bunu test edemez bu yüzden senin tablolar yok, ama bu kullanmak isteyeceksiniz yaklaşımdır:

SELECT wp_posts.*, 
    (`alias_1`.meta_value) AS `lat`, 
    (`alias_2`.meta_value) AS `lng`, 
    (3959 * acos(cos(radians(41.367682)) * cos(radians(`lat`)) * cos(radians(`lng`) -  radians(2.154077)) + sin(radians(41.367682)) * sin(radians(`lat`)))) AS `distance` 
FROM wp_posts 
    LEFT JOIN `wp_postmeta` AS `alias_1` ON wp_posts.ID = alias_1.post_id 
    LEFT JOIN `wp_postmeta` AS `alias_2` ON wp_posts.ID = alias_2.post_id 
WHERE 
    wp_posts.post_status = 'publish' 
    AND wp_posts.post_type = 'page' 
    AND wp_posts.post_date < NOW() 
    AND `alias_1`.meta_key = 'position' 
    AND `alias_1`.meta_value LIKE '41.%' 
    AND `alias_2`.meta_key = 'position' 
    AND `alias_2`.meta_value LIKE '2.%' 
GROUP BY wp_posts.`ID` 
ORDER BY `distance` ASC 

Orada bazı sözdizimi hataları olabilir, ama ben mantık olduğuna inanıyoruz kabaca doğru. Bu işe yararsa bana bildirin.

+1

Önerileriniz için teşekkürler! Sorgunuzu denedim, ancak daha önce olduğu gibi aynı hatayı aldım. ** Bilinmeyen sütun 'alan listesindeki' lat '** Hesaplamalarda takma adlara başvurulmaması mümkün mü? – Chris

+0

Hmm ... Şüphem var, ama devam edip sorguyu düzenleyelim ki (radyanlar ('lat')) cos (radyanlar (' alias_1'.meta_value)) vs olur ve ne olduğunu görürsünüz. Ben backticks j lat ve lng kapalı iyi bir ölçü için. –

+0

Bunu yaptım galiba! Şimdi bir çalışma sorgusu alıyorum ve mesafe sütunu bana sonuç veriyor, ancak doğru olduklarından emin değilim. Sonuçlardan biri garip görünüyor "5.89936971664429e-05", okur? – Chris

1

... takma sonraki referanslar ters tırnakların içine alınması gerekir:

SELECT wp_posts.*, 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '41.%') AS 'lat', 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '2.%') AS 'lng', 
(3959 * acos(cos(radians(41.367682)) * cos(radians(`lat`)) * cos(radians(`lng`) -  radians(2.154077)) + sin(radians(41.367682)) * sin(radians(`lat`)))) AS `distance` 
FROM wp_posts, wp_postmeta 
WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'position' AND wp_posts.post_status = 'publish' AND wp_posts.post_type = 'page' AND wp_posts.post_date < NOW() 
GROUP BY `ID` 
ORDER BY 'distance' ASC 
burada yapmanız gereken

http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html

+0

"Alan listesindeki" Bilinmeyen sütun "lat" hatasını alıyorum. Sanırım takma adlar bu şekilde referans alınamaz mı? – Chris

+0

Ah! Başka bir problemin var. Bir alt sorgu çalıştırmıyorsanız, birden çok seçim ifadeniz olmamalıdır. Sadece "SELECT wp_posts. *, Wp_postmeta.meta_value 'lat', wp_postmeta.meta_value" lng' FROM wp_posts, wp_postmeta WHRE [LISTESINIZI SIRADIĞINIZ SIRA GELINIZ]) –

+0

Ancak bu alanlardan (lat/lng) mesafe hesaplama - bu nedenle alt sorgular – Chris