2014-07-18 5 views
5

का उपयोग करके MySQL में अनाथ रिकॉर्ड ढूंढना मैं बाएं जॉइन का उपयोग करके अलग अनाथ मेनू_इटम रिकॉर्ड खोजने की कोशिश कर रहा हूं, फिर नल मानों की जांच कर रहा हूं।LEFT JOIN

नीचे दी गई क्वेरी वास्तव में अनाथ नहीं हैं जो परिणाम लौट रही है। mitem_id menu_item तालिका के लिए प्राथमिक कुंजी है और price_info तालिका के लिए एक विदेशी कुंजी है। pinfo_id price_info तालिका और एक विदेशी कुंजी ऑर्डर विवरण तालिका के लिए प्राथमिक कुंजी है।

SELECT DISTINCT mi.mitem_id, descr 
FROM menu_item mi 
    LEFT JOIN price_info pi ON pi.menu_item = mi.mitem_id 
    LEFT JOIN orderdetails od ON od.price_info = pi.pinfo_id 
WHERE od.detail_id IS NULL; 

रिकॉर्ड में से एक लौटे इस तरह दिखता है:

+----------+------------------+ 
| mitem_id | descr   | 
+----------+------------------+ 
|  926 | Alameda Pale Ale | 
+----------+------------------+ 

मुझे कैसे पता चलेगा कि यह एक अनाथ नहीं है क्योंकि जब मैं क्वेरी चलाने है:

SELECT od.detail_id 
FROM orderdetails od 
    INNER JOIN price_info pi ON pi.pinfo_id = od.price_info 
    INNER JOIN menu_item mi ON mi.mitem_id = pi.menu_item 
WHERE mi.mitem_id = 926; 

यह का एक सेट देता है रिकॉर्ड:

+-----------+ 
| detail_id | 
+-----------+ 
| 142830 | 
| 142876 | 
| 143394 | 
| 143610 | 

यह नतीजे क्यों लौट रहे हैं जो अनाथाश्रम नहीं हैं?

+0

बाएं जॉइन "बाएं" तालिका में मौजूद सभी प्रविष्टियों को लौटाता है, जो कि "दाएं" तालिका में हो सकता है या नहीं हो सकता है। यह अभी भी "दाएं" तालिका में रिकॉर्ड लौटाएगा क्योंकि वे "बाएं" तालिका में भी हैं। –

+0

यदि आप बाहरी जॉइन का उपयोग कर रहे हैं तो परिणाम के लिए आपके जॉइन का अनुक्रम प्रासंगिक है। आपके प्रश्न बहुत अलग हैं। आपको अपनी अन्य तालिकाओं के लिए न्यूनतम नमूना डेटा जोड़ना चाहिए। – VMai

+2

क्या यह संभव है कि ऑर्डर विवरण से कम से कम एक पंक्ति में शामिल हों, जहां detail_id पूर्ण है? यही है, शायद ऑर्डर विवरण से कई पंक्तियां हैं जो मेनू_इटम और price_info से मेल खाते हैं, और कम से कम एक NULL नहीं है – kane

उत्तर

1

केन सही था कि रिकॉर्ड वापस लौटाए जा रहे थे जो शून्य नहीं थे। Menu_item और price_info के बीच कई रिश्तों में से कई ने मुझे अनाथ रिकॉर्ड खोजने के लिए पूरी तरह से बाएं जॉइन का उपयोग करने से रोक दिया। मैंने अपनी क्वेरी को बदलना शुरू कर दिया:

SELECT DISTINCT mi.mitem_id, descr FROM menu_item mi 
WHERE mi.mitem_id NOT IN 
(SELECT mi.mitem_id FROM menu_item mi 
INNER JOIN price_info pi ON pi.menu_item = mi.mitem_id 
INNER JOIN orderdetails od ON od.price_info = pi.pinfo_id) 
संबंधित मुद्दे