6

文字列 2 つの多対多の関連付けを取得しようとしています。この例では、各チームの色の数は未定で、賞を獲得したチームの数は未定です。

これはスキーマです:

ここに画像の説明を入力

そして、これは私が使用しているクエリです:

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-Team の色が赤と青で、賞が TrollAward と DarwinAward であるとしましょう... SQL から取得した結果は次のようになります。

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

私は1つの多対多に参加しようとしましたが、完全に機能するので、複数の結合で何かを監督していると思います...

4

1 に答える 1

4

手っ取り早い答えはDISTINCTGROUP_CONCAT()関数を追加することです。

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

大きなテーブルでは、これはあまり効率的ではないかもしれません。2 番目の方法は、2 つのサブクエリ (派生テーブル) を使用することです。一方と他方でGROUP BY連結を取得し、これらの派生テーブルを結合します。awardscolurs

于 2013-06-20T08:06:55.613 に答える