2013-06-20 6 views
5

2つの多対多の関連付けを取得しようとしています。この例では、各チームの色数は不定で、未定数が賞を獲得しています。2つの多対多を使用する場合の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 

を問題は、色や賞をを重複してしまうことがあります。私はこのようなSQLを見てから取得結果...のは、チームカラーのように、と賞TrollAwardとDarwinAwardとして赤と青があるとしましょう:

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

私は唯一の多対に参加しようとしています多くの、そして完璧に動作しますので、私は、私は複数で何かを監督してい推測することは、迅速かつ汚い答えがGROUP_CONCAT()機能でDISTINCTを追加することです...

+2

私の答えはこちらをご覧ください:[MySQL Group_Concatの値を繰り返す](http://stackoverflow.com/questions/11486266/mysql-group-concat-repeating-values/11486365#11486365) –

答えて

2

に参加する:

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

これはないかもしれません大きなテーブルでは非常に効率的です。 2つ目の方法は、awardsの連結ともう一方のcolursの連結を得る2つのサブクエリ(導出テーブル)のGROUP BYです。これらの導出テーブルを結合します。

+0

ありがとうございます。それは 'DISTINCT'と一緒に働きます。とにかく、これらの派生テーブルがどのように機能するかを見てみましょう。 – bgusach

+1

これを参照してください[回答](http://stackoverflow.com/questions/14140288/mysql-aggregate-functions-in-query-with-two-joins-gives-unexpected-results/14140884#14140884) "第3の選択肢..." *) –

+0

ありがとう、非常に役立つ! – bgusach

関連する問題