2010-12-15 33 views
37

MySQL'in "GROUP_CONCAT" işlevi ile ilgili bir sorun yaşıyorum. Ben basit bir yardım masası veritabanı kullanarak sorunumu gösterilecektir: Bu yardım masası veritabanı iki çözüm girişleriyle iki bilet, her sahip olduğunuMySQL: GROUP_CONCAT LEFT JOIN ile

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.'); 

dikkat edin. Amacım, veritabanındaki tüm biletlerin bir listesini oluşturmak için bir yanıt cümleleri kullanmaktır.

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

yukarıdaki deyim ile sorun yalnızca bir satır döndürüyor edilir: Bu kullanıyorum SELECT ifadesi olan

hem bilet 1'ler ve birlikte bilet 1'in bilgi döndürüyor o
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. 

Bildirimi bilet 2'nin çözüm girişleri.

Neyi yanlış yapıyorum? Teşekkürler!

cevap

71

Kullanım:

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 

Alternatif: basitçe Tickets.id GROUP BY ekleyerek:

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

Bu işe yarıyor! Teşekkür ederim! – Nick

+3

Ama neden Nick'in yöntemi çalışmıyor? Belli ki öyle değil, ama olması gerektiği gibi görünüyor. Bunu bana açıklayabilir misin? – pbarney

+0

Şimdiye kadar anlıyorum ki, group_contact sorgunun parçaları ile ilgilenmiyor, tüm ara sonuçları gruplandırıyor. – jnovacho

1

Ben @Dylan Valade en comment başka cevap olarak post ediyorum bu yüzden en basit cevap olduğunu düşünüyorum OP'in SEÇİMİ sorunu düzeltmelidir. Kendi sorunumu çözdü. Ancak, küçük kabul edilmeyen veri tabanları için kabul edilen cevaplar için, özellikle Bilet.id'de herhangi bir yüklem varsa, toplam tablo taraması yapılmaz gibi görünür ve önceki paragraf doğru sonuçları döndürürken çok daha az görünür gibi görünmektedir. Benim durumumda verimli.