2013-06-20 92 views
5

我試圖在兩個多對多關聯中得到一個字符串。在這個例子中,每個團隊都有不確定數量的顏色,並且不確定的數量贏得了獎項。使用兩個多對多時在GROUP_CONCAT中重複值

這是架構:

enter image description here

這是我使用的查詢:

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 

的問題是,顏色和獎項得到複製。比方說,A-團隊有紅色和藍色的顏色,並作爲獎勵TrollAward和DarwinAward ......結果我從SQL看起來像這樣得到:

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

我曾嘗試加入僅僅是許多-TO-許多和完美的作品,所以我想我的東西監督與多加入...

+2

在這裏看到我的答案:[MySQL Group_Concat重複值](http://stackoverflow.com/questions/11486266/mysql-group-concat-repeating-values/11486365#11486365) –

回答

2

快速和骯髒的答案是增加DISTINCTGROUP_CONCAT()功能:

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

這可能不是非常有效,但大桌子。第二種方法是在兩個子查詢(派生表)中對GROUP BY進行處理,其中一個從awards開始連接,另一個從colurs開始,然後連接這些派生表。

+0

非常感謝。它適用於「DISTINCT」。無論如何,你能否參考一下我可以看到這些派生表如何工作的例子? – bgusach

+1

看到這個[答](http://stackoverflow.com/questions/14140288/mysql-aggregate-functions-in-query-with-two-joins-gives-unexpected-results/14140884#14140884)(它說* 「第三個選項...」*) –

+0

謝謝,非常有幫助! – bgusach