2011-12-16 5 views
5

मेरे पास तीन टेबल: tickets, ticket_solutions, और solutions शामिल MySQL में कई से अधिक तालिका संबंध हैं। (। एक टिकट कई समाधान हो सकता है, और समाधान कई टिकट के लिए लागू)कई से अधिक रिश्तों के लिए बाएं बाहरी जुड़ने का उपयोग करना जहां शून्य की अनुमति है

यहाँ तालिका संरचनाओं, सरलीकृत कर रहे हैं:

tickets ticket_solutions solutions 
-----  -----    ----- 
id   ticket_id   id 
      solution_id   solution 

(इस उदाहरण में, सभी क्षेत्रों INTsolutions.solution जो VARCHAR है सिवाय कर रहे हैं।) चूंकि कुछ टिकट पूरा नहीं हुए हैं, इसलिए उनके पास कोई समाधान नहीं हो सकता है।

मैं निम्न क्वेरी लिखा है:

SELECT t.id, GROUP_CONCAT(DISTINCT sol.solution SEPARATOR ', ') solutions 
FROM tickets t 
LEFT JOIN ticket_solutions tsol ON (tsol.ticket_id = t.id) 
LEFT JOIN solutions sol ON (tsol.solution_id = sol.id) 
GROUP BY t.id DESC; 

मेरा प्रश्न दूसरा LEFT JOIN साथ निहित है। किसी भी स्थिति में जहां दिए गए टिकट के लिए लिंकर तालिका (ticket_solutions) में कोई प्रविष्टि मौजूद है, हमेशाsolutions में मिलान करने के लिए एक रिकॉर्ड हो। हालांकि अगर मैं INNER JOIN का उपयोग करने की कोशिश करता हूं, तो मुझे अब ऐसे टिकट नहीं मिलेंगे जिनमें समाधान की कमी है।

मेरी सोच के लिए, NULL मान केवल tickets और लिंकर तालिका के बीच संबंधों में होगा। (किसी भी समाधान के बिना अभी तक टिकट।)

मैं लिंकर तालिका के बीच एक LEFT JOIN और solutions का उपयोग करना चाहिए, भले ही उस विशेष रिश्ते में NULL मान नहीं होगा?

यदि नहीं, तो अनुशंसित क्वेरी संरचना क्या है?

उत्तर

7

इसे इस तरह का प्रयास करें:

SELECT t.id, GROUP_CONCAT(DISTINCT sol.solution SEPARATOR ', ') solutions 
    FROM tickets t 
     LEFT JOIN ticket_solutions tsol 
      INNER JOIN solutions sol 
       ON (tsol.solution_id = sol.id) 
      ON (tsol.ticket_id = t.id) 
    GROUP BY t.id DESC; 
+0

यह मैं वास्तव में क्या ढूंढ रहा था। धन्यवाद। – JYelton

1

अपने मूल एसक्यूएल में आप ticket_solutions के लिए टिकट बाएं में शामिल होने के लिए, तो भीतरी में शामिल होने के समाधान है, जो एक इसी समाधान के बिना पंक्तियों को दबाने जाएगा जिसके परिणामस्वरूप दृश्य।

जो Stefanelli के जवाब में है, जो भी रूप में

SELECT t.id, GROUP_CONCAT(DISTINCT sol.solution SEPARATOR ', ') 
FROM tickets t 
LEFT JOIN 
    (SELECT ticket_solutions.ticket_id AS id, solutions.solution AS solution 
    FROM ticket_solutions tsol 
    INNER JOIN solutions ON ticket_solutions.solution_id=solutions.id 
    ) AS sol ON t.id=sol.id 

आप पहली बार ticket_solutions समाधान करने के लिए भीतरी में शामिल होने लिखा जा सकता है, तो टिकट के लिए जिसके परिणामस्वरूप दृश्य बाएं में शामिल होने, इस प्रकार खाली टिकट दबाकर नहीं।

0

जो स्टीफनेल्ली का उत्तर बिल्कुल सही है। बस को जोड़ने के लिए है कि आप

IFNULL(GROUP_CONCAT(DISTINCT sol.solution SEPARATOR ', '), '') 

उपयोग कर सकते हैं nulls के बजाय कोई रिक्त स्ट्रिंग करना चाहते थे।

हालांकि, बाद से एक ही समस्या के बारे में कुछ अन्य विचार विमर्श भ्रमित कर रहे हैं, बस के रूप में अच्छी तरह से इस बेला से जोड़ने के लिए चाहता था: http://www.sqlfiddle.com/#!2/54c6f/3/0

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