2013-06-20 15 views
5

Próbuję uzyskać w łańcuchu dwa skojarzenia wiele do wielu. W tym przykładzie każda drużyna ma nieokreśloną liczbę kolorów, a nieokreślona liczba zdobyła nagrody.Powielanie wartości w GROUP_CONCAT przy użyciu dwóch wielu do wielu

Jest to schemat:

enter image description here

I to jest kwerenda Używam:

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 

Problemem jest to, że kolory i nagrody uzyskać duplikowane. Powiedzmy A-Team ma czerwony i niebieski jako barwach, jak i nagród TrollAward i DarwinAward ... wyniki dostaję od wyglądu SQL jak poniżej:

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

próbowałem dołączyć tylko jedną wiele-to- wielu, i działa idealnie, więc myślę, że mam coś z nadzorowanie wielokrotna dołącza ...

+2

Zobacz moją odpowiedź tutaj: [MySQL Group_Concat Powtarzające wartości] (http://stackoverflow.com/questions/11486396/mysql-group-concat-repeating-values/11486365#11486365) –

Odpowiedz

2

odpowiedź szybki i brudny jest dodanie DISTINCT w funkcjach GROUP_CONCAT():

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

to nie może być bardzo wydajny, ale z dużymi tabelami. Drugie podejście to GROUP BY w dwóch podzapytaniach (wyprowadzonych tabelach), gdzie można uzyskać konkatenację z awards w jednym i od colurs w drugim, a następnie połączyć te wyprowadzone tabele.

+0

Dziękuję bardzo. Działa z 'DISTINCT'. W każdym razie, czy możesz odwołać się do dowolnego przykładu, w którym mogę zobaczyć, jak działają te tabele wyprowadzone? – bgusach

+1

Zobacz to [odpowiedź] (http://stackoverflow.com/questions/14140288/mysql-aggregate-functions-in-query-with-joinsonsives-soulsed-results/14140884#14140884) (gdzie znajduje się * "Trzecia opcja ..." *) –

+0

Dzięki, bardzo pomocne! – bgusach