MySQL जहां क्लॉज के साथ जुड़ता है


130

मेरे पास दो टेबल हैं जो मैं शामिल होना चाहता हूं।

मैं सभी श्रेणियों की तालिका में सभी श्रेणियों को चाहता हूं और सभी श्रेणियों की श्रेणी में एक उपयोगकर्ता द्वारा सदस्यता ली गई है।

अनिवार्य रूप से यह मेरी अब तक की क्वेरी है:

SELECT *
FROM categories
LEFT JOIN user_category_subscriptions 
     ON user_category_subscriptions.category_id = categories.category_id

यह ठीक काम करता है, लेकिन मैं क्वेरी के अंत में एक क्लॉज जोड़ना चाहता हूं, जो अनिवार्य रूप से इसे आंतरिक / इक्वी जॉइन करता है।

   SELECT *
    FROM categories
    LEFT JOIN user_category_subscriptions 
         ON user_category_subscriptions.category_id = categories.category_id 
   WHERE user_category_subscriptions.user_id = 1

मैं केवल एक क्वेरी का उपयोग करके किसी विशेष उपयोगकर्ता द्वारा सदस्यता ली गई सभी श्रेणियों के साथ-साथ सभी श्रेणियां कैसे प्राप्त करूं?

category_id दोनों श्रेणियों की तालिका में एक कुंजी है और user_category_subscos। user_id में रहने वाले user_category_subsaches तालिका।

धन्यवाद


मेरा मानना ​​है कि अगर मैं गलत नहीं हूँ तो इसे 'राइट जॉइन' कहा जाता है?
टायलर कार्टर

जवाबों:


287

आपको इसे joinखंड में रखने की आवश्यकता है , न कि where:

SELECT *
FROM categories
LEFT JOIN user_category_subscriptions ON 
    user_category_subscriptions.category_id = categories.category_id
    and user_category_subscriptions.user_id =1

देखें, एक के साथ inner join, joinया में एक खंड डाल whereसमकक्ष है। हालांकि, एक के साथ outer join, वे बहुत अलग हैं।

एक joinशर्त के रूप में , आप उन पंक्तियों को निर्दिष्ट करते हैं जिन्हें आप तालिका में शामिल करेंगे। इस का मतलब है यह मूल्यांकन करता है कि user_id = 1पहले, और के सबसेट लेता है user_category_subscriptionsएक साथ user_idकी 1की सभी पंक्तियां को शामिल होने के लिए categories। इससे आपको सभी पंक्तियाँ मिलेंगी categories, जबकि केवल categoriesउस विशेष उपयोगकर्ता ने सदस्यता ली है जिसके पास user_category_subscriptionsकॉलम में कोई जानकारी होगी । बेशक, अन्य सभी कॉलम में categoriesआबादी होगी ।nulluser_category_subscriptions

इसके विपरीत, एक whereखंड जुड़ता है, और फिर पंक्तियों को कम करता है। तो, यह सभी जोड़ देता है और फिर उन सभी पंक्तियों को समाप्त user_idकरता है जहां समान नहीं है 1। आप एक पाने के लिए एक अक्षम तरीके के साथ रह गए हैं inner join

उम्मीद है कि यह मदद करता है!


2
अच्छी तरह से सवाल डाला, और अच्छी तरह से जवाब दिया! मेरा समय बचाया। आपका बहुत बहुत धन्यवाद!
गौरव फपले

1
मुझे तुमसे बहुत प्यार है एरिक तुमने मुझे रोने से बचाया: D
Raheel

दूसरी ओर, अगर मैं उपयोगकर्ताओं के लिए एक स्वच्छ डेटा का उत्पादन करना चाहता हूं तो दूसरा (जहां) तरीका अधिक उपयुक्त है। क्या यह सही है ?
vlr

1
नमस्ते, हम chuck कर सकते हैं user_category_subsults.user_id अशक्त है। एक तालिका में विस्तार आईडी को पुनः प्राप्त करने के लिए जिसमें बी तालिका में आईडी शून्य है
वीरेश् वाइज

@ Veeresh123, क्या Aऔर Bटेबल हैं? क्या आप अपने प्रश्न को दोबारा लिख ​​सकते हैं?
इस्तियाक अहमद

11

इसे इस्तेमाल करे

  SELECT *
    FROM categories
    LEFT JOIN user_category_subscriptions 
         ON user_category_subscriptions.category_id = categories.category_id 
   WHERE user_category_subscriptions.user_id = 1 
          or user_category_subscriptions.user_id is null

अगर मुझे अभी भी इस कोड का उपयोग करने में त्रुटि हो रही है, तो मैं आगे क्या देखूंगा।
जैक फ्रेंगन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.