2013-10-23 13 views
5

के साथ सबक्वायरी में शामिल हों मैं जॉइन स्टेटमेंट में एक सबक्वायरी के साथ एक काफी सरल क्वेरी डाल रहा हूं। यह केवल तभी काम करता है जब मैं subquery चयन में * शामिल करता हूं। क्यूं कर?MySQL बाईं ओर *

यह काम करता है

$sql = 'SELECT locations.id, title, name, hours.lobby 
     FROM locations 
     LEFT JOIN states ON states.id = locations.state_id 
     LEFT JOIN (SELECT *, type_id IS NOT NULL AS lobby FROM location_hours) AS hours ON locations.id = hours.location_id 
     GROUP BY locations.id'; 

यह नहीं

$sql = 'SELECT locations.id, title, name, hours.lobby 
     FROM locations 
     LEFT JOIN states ON states.id = locations.state_id 
     LEFT JOIN (SELECT type_id IS NOT NULL AS lobby FROM location_hours) AS hours ON locations.id = hours.location_id 
     GROUP BY locations.id'; 

मैं भी यह इस तरह से कर रही किया जाना चाहिए? मैंने सोचा * अगर आपको सभी क्षेत्रों की आवश्यकता नहीं है तो सबसे अच्छा नहीं था?

उत्तर

20

इस कोशिश (अगर मैं अपने इरादे को सही ढंग से समझ में आया, कि आप type_id नहीं अशक्त पर फ़िल्टर करना चाहता था):

$sql = 'SELECT locations.id, title, name, hours.lobby 
     FROM locations 
     LEFT JOIN states ON states.id = locations.state_id 
     LEFT JOIN (SELECT location_id, type_id AS lobby FROM location_hours 
     WHERE type_id IS NOT NULL) AS hours ON locations.id = hours.location_id 
     GROUP BY locations.id'; 

विवरण आप सभी क्षेत्रों जो संदर्भ दिया गया है भीतरी क्वेरी में चयन करने के लिए है कि है बाहरी क्वेरी में।

+1

आपकी समस्या जब आपने केवल अपने उपखंड से एक फ़ील्ड चुना था, तो यह था कि आप शामिल कथन नहीं कर सके, क्योंकि घंटे। स्थान_आईडी को उपकुंजी द्वारा आपूर्ति नहीं की गई थी अगर आपने केवल टाइप_आईडी चुना है। – Ashalynd

+0

यह समझ में आता है। और मुझे लगता है कि बहुत स्पष्ट है। वैसे भी यह काम करता है। धन्यवाद। – MAZUMA

+0

यह भी जांचें कि आपको वास्तव में उपयोग करने की आवश्यकता है (दूसरे मामले में) जॉइन के बजाय बाएं जॉइन करें। यदि आप नल टाइप_आईड नहीं चाहते हैं तो मुझे लगता है कि आप वास्तव में एक जॉइन (जो आमतौर पर तेज होता है) चलाने के लिए चाहते हैं। – Ashalynd

0

चूंकि आप टाइप_आईडी के लिए गैर-शून्य मान प्राप्त करना चाहते हैं, तो आपको इसके लिए बाएं जॉइन का उपयोग नहीं करना चाहिए। आप निम्नलिखित चाहते हैं, जो एक मानक जॉइन का उपयोग करता है।

$sql = 'SELECT locations.id, title, name, location_hours.type_id 
     FROM locations 
     JOIN location_hours ON location_hours.location_id = locations.id 
     LEFT JOIN states ON states.id = locations.state_id 
     WHERE location_hours.type_id IS NOT NULL 
     GROUP BY locations.id'; 

जॉइन का पूरा बिंदु यह है कि यह केवल पंक्तियों में शामिल होता है जो वास्तव में मौजूद हैं। तो आपको कोई भी पंक्ति नहीं मिलेगी जहां location_hours में location.id पर कोई स्थान_आईडी नहीं है। फिर आप location_hours.type_id के लिए नल मानों को फ़िल्टर करें।

+0

यदि मैं केवल स्थान पंक्तियों में शामिल होता हूं। मुझे सभी स्थान पंक्तियां चाहिए। मैं फिर देखना चाहता हूं कि उन स्थानों के लिए घंटों को सेट किया गया है या नहीं, यह देखने के लिए कि कोई नल मूल्य है या नहीं। – MAZUMA

+0

मुझे यकीन नहीं है कि मैं समझता हूं कि आपका क्या मतलब है। क्या आप इसे फिर से ले सकते हैं? एक तरफ, आपके बाएं जॉइन काम नहीं कर रहे कारण यह है कि subquery location_id का चयन नहीं कर रहा है लेकिन आप इसे ऑन कंडीशन के लिए उपयोग कर रहे हैं। – Chill

+0

यदि मैं जॉइन चलाता हूं तो इसमें पंक्तियां शामिल नहीं होती हैं जहां कोई घंटा टाइप_आईडी मौजूद नहीं है। मैं सभी स्थान पंक्तियां प्राप्त करना चाहता हूं और फिर प्रत्येक स्थान के लिए type_id के लिए कोई मान है या नहीं। मैं उस मूल्य का उपयोग यह निर्धारित करने के लिए कर रहा हूं कि उस विशेष स्थान के लिए घंटों को जोड़ने या संपादित करने की आवश्यकता है या नहीं। – MAZUMA

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