2012-07-10 17 views
5

मुझे एक मॉड्यूल को लागू करने में कोई समस्या है जहां एक project एकाधिक categories से संबंधित हो सकता है। उदाहरण: प्रोजेक्ट "PHP प्रोग्रामर" श्रेणियों से संबंधित है: प्रोग्रामिंग, PHP।MySQL LEFT डुप्लिकेट जॉइन परिणाम

निम्न क्वेरी (चयन परियोजनाओं श्रेणियों 1,3,11 के हैं) मान लिया जाये:

SELECT projects.* FROM projects 
    LEFT JOIN pojects_category on projects.id = pojects_category.project_id 
    WHERE pojects_category.category_id IN (1,3,11) and projects.id='94'` 

मैं एक एक ही परियोजना में दो बार लौटे मिलता है, क्योंकि वहाँ में मिलान हैं project_id के लिए तालिका = 94

टेबल projects_category स्कीमा:

CREATE TABLE IF NOT EXISTS `pojects_category` (
    `project_id` int(10) NOT NULL, 
    `category_id` int(10) NOT NULL, 
    KEY `category_id` (`category_id`), 
    KEY `project_id` (`project_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 


INSERT INTO `pojects_category` (`project_id`, `category_id`) VALUES 
(94, 3), 
(94, 1); 

क्या मुझे कुछ याद आ रही है?

समाधान: का उपयोग GROUP BY या DISTINCT

+1

यदि आप केवल प्रत्येक प्रोजेक्ट में से एक चाहते हैं, तो अपनी क्वेरी – mariusnn

+0

@mariusnn पर 'GROUP BY project_id'' संलग्न करें, यह काम करता है! – technology

+0

समूह का उपयोग न करें, मेरी स्पष्टीकरण – Sebas

उत्तर

8

नहीं, यह ठीक है। यह दुर्लभ मामलों में से एक है जब आप डुप्लिकेट को हटाने के लिए DISTINCT कुंजी शब्द का उपयोग करना चाहते हैं।

इस मामले में यह इस तथ्य से न्यायसंगत है कि क्वेरी का तर्क सही है, भले ही यह एक से अधिक पंक्तियों को लौटाता है। कई बार DISTINCT का उपयोग देख सकता है जब वास्तव में क्वेरी का तर्क गलत होता है।

साइड-ध्यान दें:

  • एक मेज संदर्भ आप WHEREIS NULL/IS NOT NULL के अलावा अन्य खंड में उपयोग कर रहे हैं पर किसी भी फिल्टर एक INNER JOIN को यह एक ही मेज संदर्भ मोड़ पर किसी भी LEFT JOIN बनाने, अंतिम resultset के लिए के रूप में होगा व्यवहार। (यह देखें: https://stackoverflow.com/a/15483895/1291428)
  • आप GROUP BY का उपयोग नहीं करना चाहिए DISTINCT के प्रभाव अनुकरण करने के लिए, 2 कारणों के लिए:

    1/यह सिर्फ नहीं उद्देश्य है। GROUP BY के प्रभावों में से एक डुप्लीकेट को खत्म करना है, लेकिन इसका मुख्य उद्देश्य उन पर कुछ विश्लेषणात्मक गणना/संचालन लागू करने के लिए मानदंडों के एक निश्चित सेट के अनुसार पंक्तियों को समूहित करना है।

    2/GROUP BY भी ORDER BY परिणाम (mysql में), जो आवश्यक नहीं है कि आप क्या चाहते हैं और उस मामले में निष्पादन धीमा हो जाता है। कृपया, इंजनों द्वारा प्रदान किए जाने वाले उचित उपयोग को सुनिश्चित करें, यह आगे संगतता के दृष्टिकोण से हमेशा बेहतर होता है। (यह अनुमान लगाते हुए कि आप जो भी शामिल करते हैं वह वास्तव में नहीं है)

संबंध।

+0

अच्छी तरह से देखें, मुझे नहीं पता था कि मैंने समूह को खरीदा DISTINCT का समानार्थी था। धन्यवाद, अब मैं अलग-अलग उपयोग कर रहा हूं और यह बहुत अच्छा काम करता है :) – technology

+0

DISTINCT और GROUP BY के बारे में स्पष्ट बिंदु बनाने के लिए टैंक – mariusnn

0

तुम भी डुप्लिकेट के आसपास पाने के लिए एक "में" के रूप में इस पुनर्लेखन कर सकते हैं:

SELECT projects.* 
FROM projects  
where projects.id in (select project_id 
         from projects_category 
         WHERE pojects_category.category_id IN (1,3,11) 
        ) and 
     projects.id='94' 

"में" छानने रिकॉर्ड के लिए मिलती है बनाने के लिए जब आप उपयोग कर रहे हैं से डुप्लिकेट को रोकता है।

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