एसक्यूएल लेफ्टिनेंट जॉय सबक्वेरी अलायस


87

मैं यह SQL क्वेरी चला रहा हूँ:

SELECT wp_woocommerce_order_items.order_id As No_Commande
FROM  wp_woocommerce_order_items
LEFT JOIN 
    (
        SELECT meta_value As Prenom
        FROM wp_postmeta
        WHERE meta_key = '_shipping_first_name'
    ) AS a
ON wp_woocommerce_order_items.order_id = a.post_id
WHERE  wp_woocommerce_order_items.order_id =2198

और मुझे यह त्रुटि मिलती है:

# 1054 - अज्ञात कॉलम 'a.post_id' पर 'खंड में'।

मुझे लगता है कि मेरा कोड बहुत सरल है, लेकिन मैं इसे सही नहीं बना सकता। मैं क्या गलत कर रहा हूं?

जवाबों:


145

आपने post_idउपकुंजी में चयन नहीं किया । आपको इसे इस तरह से उपकुंजी में चुनना होगा:

SELECT wp_woocommerce_order_items.order_id As No_Commande
FROM  wp_woocommerce_order_items
LEFT JOIN 
    (
        SELECT meta_value As Prenom, post_id  -- <----- this
        FROM wp_postmeta
        WHERE meta_key = '_shipping_first_name'
    ) AS a
ON wp_woocommerce_order_items.order_id = a.post_id
WHERE  wp_woocommerce_order_items.order_id =2198 

1
आपको बहुत - बहुत धन्यवाद! मैं इसी तरह की समस्या पर काम कर रहा हूं और लेफ्ट जॉइन से पहले WHERE क्लॉज लगा रहा था और एक त्रुटि हो रही थी। इससे वाकई मदद मिली। धन्यवाद!
1

1
दोस्त, आप एक किंवदंती हैं, पांडा से एसक्यूएल में आ रही हैं और मैं एक गर्म मिनट के लिए मेरे सिर को खरोंच रहा था सोच रहा था कि एक उप क्वेरी क्यों काम करेगी। खुश होती है।
Manakin

21

मैं मानता हूं कि उत्तर काम करता है और स्वीकार कर लिया गया है, लेकिन उस क्वेरी को लिखने के लिए बहुत क्लीनर तरीका है। Mysql पर परीक्षण किया गया और पोस्टग्रेज किया गया।

SELECT wpoi.order_id As No_Commande
FROM  wp_woocommerce_order_items AS wpoi
LEFT JOIN wp_postmeta AS wpp ON wpoi.order_id = wpp.post_id 
                            AND wpp.meta_key = '_shipping_first_name'
WHERE  wpoi.order_id =2198 

1
नमस्ते, ब्याज से, यह विधि अधिक कुशल होगी? वैकल्पिक रूप से यह "और wpp.meta_key = '_shipping_first_name'" को स्थानांतरित करने के लिए और अधिक कुशल कहाँ होगा?
क्रिस

1
ईमानदारी से, मुझे उन दोनों में से कोई भी विचार नहीं है। मैं अभी इस उत्तर पर आया और देखा कि प्रश्न लिखने के लिए क्लीनर तरीका था इसलिए मुझे लगा कि मैं इसे इंगित करूंगा। क्षमा करें, मैं और अधिक मदद नहीं कर सकता।
ईजे

1
MySQL / PostgreSQL में आप उपयोग कर सकते हैं EXPLAIN SELECT ...MSSQL के लिए या SET SHOWPLAN_ALL ONया SET SHOWPLAN_XML ONदेखने के लिए कैसे पंक्तियों प्राप्त किए गए हैं। MySQL में used filesort, used temporaryधीमे हैं और इसे टाला जाना चाहिए। ज्वाइन सबक्वेरी के लिए, पोस्ट / ऑर्डर आईडी में शामिल होने से पहले wp_postmeta टेबल से मेटा_की वैल्यू से मेल खाती सभी पंक्तियों को पुनः प्राप्त करना होगा। इसलिए यह मान लेना सुरक्षित होना चाहिए कि ऑर्डर / पोस्ट आईडी और मेटा_की पर मेल करना तेजी से होगा। आम तौर पर आपके द्वारा उपयोग की जाने वाली एक उपश्रेणी सबसे अच्छी होती ORDER BY LIMITहै जिसे मुख्य क्वेरी से फ़िल्टर नहीं किया जा सकता है।
विल बी।

1
SQLFiddle परिणामों के उदाहरण: Criteria on Join sqlfiddle.com/#/284e/5 और Subquery on Join sqlfiddle.com/@2/e84fa/3 ध्यान दें कि Subquery on Joinwp_postmeta से 22 पंक्तियों को पुनर्प्राप्त किया गया था जबकि Criteria on Joinकेवल wp_postmeta से 1 पुनर्प्राप्त किया गया था।
विल बी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.