2013-08-17 19 views
15

Ich habe Abfrage, die Zeichenfolgen verketten, wenn sie zu einer Gruppe gehören.Wie vermeidet man Doppelarbeit in GROUP_CONCAT?

SELECT e.id, 
     ke.value, 
     re.value AS re_value, 
     GROUP_CONCAT(g.value,', ') 
     FROM entry e 
       INNER JOIN k_ele ke ON e.id = ke.fk 
       INNER JOIN r_ele re ON e.id = re.fk 
       INNER JOIN sense s ON e.id = s.fk 
       INNER JOIN gloss g ON s.id = g.fk 
WHERE g.lang IS NULL 
GROUP BY s.id 
ORDER BY re_value 

Aber

GROUP_CONCAT (g.value, '')

schenkt dieses Ergebnis.

zärtlich Beziehung, zärtlich Beziehung, zärtlich Beziehung, zärtlich Beziehung, Beziehung zu lieben, liebevolle Beziehung, liebevolle Beziehung, liebevolle Beziehung

Wie Sie sehen können, gibt es Doppelungen in Verkettung. Wie vermeidet man Doppelungen in Verkettungen?

Antwort

23
GROUP_CONCAT(DISTINCT g.value) 
+5

Dies funktioniert, aber Sie können ein Trennzeichen nicht angeben, wenn Sie 'GROUP_CONCAT (DISTINCT' in SQLite, Wenn Sie das Begrenzungszeichen vom Standard ',' ändern möchten, müssen Sie entweder den Unterabfrageansatz verwenden, wie in der CL-Antwort angezeigt, oder einen Ersatz verwenden (ich würde mir vorstellen, dass der Unterabfrageansatz viel besser ist) – GarethD

+4

Ich musste das jammen in eine schon böse Anfrage, also ging ich mit '' 'ersetzen (GROUP_CONCAT (DISTINCT g.value), ',', der_Delimiter)' ''. Es ist schrecklich, aber ich wollte zeigen ein schneller Weg, um damit fertig zu werden, wenn Sie mit Ihrem anderen Begrenzer und einer sehr großen Abfrage, die die Unterabfrage schwierig machen würde, stecken bleiben. Sie müssen sicher sein, dass Ihre Werte keine Kommas enthalten, damit dies funktioniert. – Kelly

+0

Für große Daten Unterabfrage ist der richtige Weg zu tun. In diesem Fall wird Distinct nur ein Hack sein. –

2

Sie haben die Duplikate zu entfernen, bevor die GROUP_CONCAT Anwendung, die in der Regel eine Unterabfrage erfordert:

SELECT a, GROUP_CONCAT(b) 
FROM (SELECT DISTINCT a, b 
     FROM MyTable) 
GROUP BY a 
Verwandte Themen