2011-12-30 17 views
6

मैं नीचे की दूरी कैलक्यूशन बनाने के लिए दो उपक्विरी से अपने कॉलम उपनाम (लैट और एलएनजी) का उपयोग कैसे कर सकता हूं? जो मैं मूल रूप से करने की कोशिश कर रहा हूं वह है कि देशांतर और अक्षांश मानों का उपयोग करके दो स्थानों के बीच की दूरी की गणना करना। लेकिन किसी भी तरह से मेरे उपनाम क्वेरी में प्रयोग योग्य नहीं हैं, क्यों?गणना के लिए MySQL कॉलम उपनाम का उपयोग कैसे करें?

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

आप अपनी अभिव्यक्ति में उद्धरणों में लैट और एलएनजी क्यों डालते हैं? –

+0

क्या यह बिना किसी त्रुटि के चलाता है या आपको इस क्वेरी को निष्पादित करते समय कुछ त्रुटियां मिलती हैं? – Lion

+0

क्वेरी चलाने के लिए उद्धरणों की आवश्यकता है, मुझे कोई त्रुटि नहीं मिलती है और सब कुछ ठीक से लौटाया जाता है सिवाय इसके कि दूरी गणना सभी रिकॉर्ड्स के लिए समान मान देती है, जिसका अर्थ है कि दर्ज किए गए मान किसी भी चीज़ के लिए उपयोग नहीं किए जाते हैं। मुझसे यहां क्या गलत हो रहा है? – Chris

उत्तर

4

ठीक है, तुम यहाँ क्या करने की जरूरत अलग उपनाम के तहत दो बार एक ही तालिका (wp_postmeta) में शामिल होने ताकि आप विभिन्न 'WHERE' की स्थिति का उपयोग कर सकते है। मैं अपने टेबल तो मैं इस परीक्षण नहीं कर सकते नहीं है, लेकिन इस दृष्टिकोण का उपयोग करना चाहते जाएगा:

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 

मैं वहाँ में कुछ वाक्य रचना त्रुटियाँ हो सकता है, लेकिन मुझे विश्वास है कि तर्क है लगभग सही है। अगर यह कार्यशील है, तो मुझे बताएं।

+1

आपके सुझावों के लिए धन्यवाद! मैंने आपकी क्वेरी की कोशिश की लेकिन पहले की तरह ही त्रुटि प्राप्त करें। ** 'फील्ड सूची' में अज्ञात कॉलम 'लैट' **। क्या यह संभव है कि उपनामों को गणनाओं में संदर्भित नहीं किया जा सके? डोडी लगता है मेरे लिए – Chris

+0

हम्म ... मुझे शक है, लेकिन आगे बढ़ें और क्वेरी को संपादित करें ताकि कॉस (रेडियंस ('लैट')) कोस (रेडियंस (' alias_1'.meta_value)) आदि हो और देखें कि क्या होता है। इसके अलावा, मैं बैकटिक्स जे में लेट और एलएनजी संलग्न है अच्छे उपाय के लिए ust। –

+0

मुझे लगता है कि यह किया था! मुझे अब एक कामकाजी क्वेरी मिल रही है, और दूरी कॉलम मुझे अब परिणाम दे रहा है, हालांकि मुझे यकीन नहीं है कि वे सही हैं। परिणामों में से एक "5.89936971664429e-05" पढ़ता है, जो अजीब लगता है? – Chris

1

बार जब आप अपने उपनाम (आप पहले और बाद में उद्धरण जोड़ना चाहिए जो) बनाया है ताकि आप एक स्ट्रिंग के रूप में यह संदर्भित नहीं करना चाहिए ... उर्फ ​​के लिए बाद में संदर्भ बैकटिक में संलग्न किया जाना चाहिए:

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 

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

+0

मुझे 'फ़ील्ड सूची' में त्रुटि "अज्ञात कॉलम 'lat' मिल रही है। मुझे लगता है कि उपनामों को इस तरह संदर्भित नहीं किया जा सकता है? – Chris

+0

आह! आपको एक और समस्या भी है। जब तक आप एक सबक्वायरी नहीं चला रहे हैं, तब तक आपके पास एकाधिक चयन कथन नहीं होना चाहिए। बस "SELECT wp_posts। *, Wp_postmeta.meta_value 'lat' के रूप में उपयोग करें, wp_postmeta.meta_value wp_posts से 'lng' के रूप में, wp_postmeta WHRE [अपनी सभी शर्तों को सूचीबद्ध करें) –

+0

लेकिन मुझे उन क्षेत्रों (lat/lng) के मानों की आवश्यकता है दूरी गणना - इसलिए subqueries। – Chris

संबंधित मुद्दे