2013-08-17 28 views
15

Mam kwerendę, która łączy ciągi, jeśli należą one do jednej grupy.Jak uniknąć duplikowania w 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 

Ale

GROUP_CONCAT (g.value, '')

daje to rezultatu.

czuły związek, związek uczuciowy, kochający związek, związek uczuciowy, kochający związek, kochający związek, kochający związek, kochający związek

Jak widać istnieją powielania w konkatenacji. Jak uniknąć duplikacji w konkatenacjach?

Odpowiedz

23
GROUP_CONCAT(DISTINCT g.value) 
+5

To działa, ale nie można określić przy użyciu separatora 'GROUP_CONCAT (DISTINCT' w SQLite, jeśli chciałbyś zmienić separator z domyślnego ',' musiałbyś albo użyć podejścia podkwerendy, jak pokazano w odpowiedzi CL, albo użyć zamiany (mogę sobie wyobrazić, że podejście podkwerendy jest o wiele lepsze.) – GarethD

+4

Musiałem zaciąć to do już nieprzyjemnego zapytania, więc poszedłem z '' 'zamień (GROUP_CONCAT (DISTINCT g.value), ',', the_delimiter)' 'To jest okropne, ale chciałem pokazać szybki sposób na poradzenie sobie z tym, jeśli utkniesz z innym ogranicznikiem i bardzo dużym zapytaniem, które utrudni podzapytanie. Musisz mieć pewność, że twoje wartości nie zawierają przecinków, aby to działało. – Kelly

+0

Dla zapytania o duże dane jest właściwym sposobem. W tym przypadku Distinct będzie tylko hackerem. –

2

Trzeba usunąć duplikaty przed nałożeniem GROUP_CONCAT, która zazwyczaj wymaga podzapytania:

SELECT a, GROUP_CONCAT(b) 
FROM (SELECT DISTINCT a, b 
     FROM MyTable) 
GROUP BY a 
Powiązane problemy