2010-12-15 9 views
37

के साथ GROUP_CONCAT मुझे MySQL के "GROUP_CONCAT" फ़ंक्शन के साथ कोई समस्या आ रही है। मैं एक साधारण मदद डेस्क डेटाबेस का उपयोग कर अपनी समस्या का वर्णन होगा:MySQL: LEFT JOIN

CREATE TABLE Tickets (
id INTEGER NOT NULL PRIMARY KEY, 
requester_name VARCHAR(255) NOT NULL, 
description TEXT NOT NULL); 

CREATE TABLE Solutions (
id INTEGER NOT NULL PRIMARY KEY, 
ticket_id INTEGER NOT NULL, 
technician_name VARCHAR(255) NOT NULL, 
solution TEXT NOT NULL, 
FOREIGN KEY (ticket_id) REFERENCES Tickets.id); 

INSERT INTO Tickets VALUES(1, 'John Doe', 'My computer is not booting.'); 
INSERT INTO Tickets VALUES(2, 'Jane Doe', 'My browser keeps crashing.'); 
INSERT INTO Solutions VALUES(1, 1, 'Technician A', 'I tried to solve this but was unable to. I will pass this on to Technician B since he is more experienced than I am.'); 
INSERT INTO Solutions VALUES(2, 1, 'Technician B', 'I reseated the RAM and that fixed the problem.'); 
INSERT INTO Solutions VALUES(3, 2, 'Technician A', 'I was unable to figure this out. I will again pass this on to Technician B.'); 
INSERT INTO Solutions VALUES(4, 2, 'Technician B', 'I re-installed the browser and that fixed the problem.'); 

सूचना है कि इस मदद डेस्क डेटाबेस दो समाधान प्रविष्टियों के साथ दो टिकट, प्रत्येक है। मेरा लक्ष्य डेटाबेस में सभी कॉरपोरोन्डिंग समाधान प्रविष्टियों के साथ सभी टिकटों की सूची बनाने के लिए एक चयन कथन का उपयोग करना है।

SELECT Tickets.*, GROUP_CONCAT(Solutions.solution) AS CombinedSolutions 
FROM Tickets 
LEFT JOIN Solutions ON Tickets.id = Solutions.ticket_id 
ORDER BY Tickets.id; 

ऊपर SELECT कथन के साथ समस्या यह केवल एक पंक्ति लौटा रहा है है:: इस SELECT कथन मैं उपयोग कर रहा हूँ है

id: 1 
requester_name: John Doe 
description: My computer is not booting. 
CombinedSolutions: I tried to solve this but was unable to. I will pass this on to Technician B since he is more experienced than I am.,I reseated the RAM and that fixed the problem.,I was unable to figure this out. I will again pass this on to Technician B.,I re-installed the browser and that fixed the problem. 

सूचना है कि यह दोनों टिकट 1 है और साथ टिकट 1 की जानकारी लौटा रहा है टिकट 2 की समाधान प्रविष्टियां।

मैं क्या गलत कर रहा हूं? धन्यवाद!

उत्तर

71

उपयोग:

SELECT t.*, 
      x.combinedsolutions 
    FROM TICKETS t 
LEFT JOIN (SELECT s.ticket_id, 
        GROUP_CONCAT(s.soution) AS combinedsolutions 
      FROM SOLUTIONS s 
     GROUP BY s.ticket_id) x ON x.ticket_id = t.ticket_id 

वैकल्पिक:

SELECT t.*, 
      (SELECT GROUP_CONCAT(s.soution) 
      FROM SOLUTIONS s 
      WHERE s.ticket_id = t.ticket_id) AS combinedsolutions 
    FROM TICKETS t 
+1

यह काम करता है! धन्यवाद! – Nick

+3

लेकिन निक की विधि क्यों काम नहीं करती है? यह स्पष्ट रूप से नहीं करता है, लेकिन ऐसा लगता है कि यह चाहिए। क्या आप इसे मुझे समझा सकते हैं? – pbarney

+0

अब तक मैं समझता हूं कि group_contact क्वेरी के हिस्सों के बारे में परवाह नहीं करता है, यह सभी मध्यवर्ती परिणामों को समूहित करता है। – jnovacho

1

मुझे लगता है कि @Dylan Valade की टिप्पणी सरल जवाब तो मैं एक और जवाब के रूप में यह पोस्टिंग कर रहा हूँ है: बस Tickets.id द्वारा किसी समूह को जोड़ना ओपी के चयन के लिए इस मुद्दे को ठीक करना चाहिए। यह मेरा खुद का मुद्दा तय किया।

हालांकि, उन डेटाबेसों के लिए जो छोटे स्वीकार्य उत्तर नहीं हैं, विशेष रूप से यदि टिकट पर कोई भविष्यवाणी है तो ऐसा लगता है कि कुल तालिका स्कैन शामिल नहीं है और इसलिए पिछला अनुच्छेद सही परिणाम देता है, यह बहुत कम प्रतीत होता है मेरे मामले में कुशल