2013-06-20 36 views
5

Tôi đang cố gắng tham gia một chuỗi hai liên kết nhiều đến nhiều. Trong ví dụ này, mỗi đội có một số màu chưa được xác định và một số chưa được xác định đã giành được giải thưởng.Giá trị trùng lặp trong GROUP_CONCAT khi sử dụng hai nhiều người nhiều đến

Đây là schema:

enter image description here

Và đây là câu hỏi tôi đang sử dụng:

SELECT 
    teams.name AS name, 
    GROUP_CONCAT(colours.name) AS colours, 
    GROUP_CONCAT(awards.name) AS awards 
FROM 
    teams 

-- join colours 
INNER JOIN teams_to_colours 
     ON teams.id = teams_to_colours.team_id 

INNER JOIN colours 
     ON teams_to_colours.colour_id = colours.id 

-- join awards 
INNER JOIN teams_to_awards 
     ON teams.id = teams_to_awards.team_id 

INNER JOIN awards 
     ON teams_to_awards.award_id = awards.id 

WHERE 
    teams.name="A-Team" 

GROUP BY 
    teams.id 

Vấn đề là màu sắc và các giải thưởng được nhân đôi. Hãy nói rằng A-Team có màu đỏ và màu xanh như màu sắc, và như giải thưởng TrollAward và DarwinAward ... kết quả tôi nhận được từ giao diện SQL như thế này:

name: "A-Team" 
colours: "red,blue,red,blue" 
awards: "TrollAward,DarwinAward,TrollAward,DarwinAward" 

Tôi đã cố gắng để tham gia chỉ có một nhiều-to- nhiều, và hoạt động hoàn hảo, vì vậy tôi đoán tôi đang giám sát một cái gì đó với nhiều tham gia ...

+2

Xem câu trả lời của tôi ở đây: [MySQL Group_Concat Giá trị lặp lại] (http://stackoverflow.com/questions/11486266/mysql-group-concat-repeating-values/11486365#11486365) –

Trả lời

2

Câu trả lời nhanh chóng và dơ bẩn là thêm DISTINCT trong GROUP_CONCAT() chức năng:

SELECT 
    teams.name AS name, 
    GROUP_CONCAT(DISTINCT colours.name) AS colours, 
    GROUP_CONCAT(DISTINCT awards.name) AS awards 
... 

này có thể không rất hiệu quả mặc dù với các bảng lớn. Cách tiếp cận thứ hai là GROUP BY trong hai truy vấn phụ (các bảng có nguồn gốc), trong đó bạn có được kết nối từ awards trong một và từ colurs trong trường còn lại, và sau đó nối các bảng có nguồn gốc này.

+0

Cảm ơn bạn rất nhiều. Nó hoạt động với 'DISTINCT'. Dù sao, bạn có thể tham khảo bất kỳ ví dụ mà tôi có thể thấy các bảng dẫn xuất này hoạt động như thế nào? – bgusach

+1

Xem [answer] này (http://stackoverflow.com/questions/14140288/mysql-aggregate-functions-in-query-with-two-joins-gives-unexpected-results/14140884#14140884) (nơi nó nói * "Một lựa chọn thứ ba ..." *) –

+0

Cảm ơn, rất hữu ích! – bgusach

Các vấn đề liên quan