MySQL DISTINCT su un GROUP_CONCAT ()

Sto facendo SELECT GROUP_CONCAT(categories SEPARATOR ' ') FROM table . Dati di esempio qui sotto:

 categories ---------- test1 test2 test3 test4 test1 test3 test1 test3 

Tuttavia, sto recuperando test1 test2 test3 test4 test1 test3 e vorrei ottenere test1 test2 test3 test4 indietro. Qualche idea?

Grazie molto!

GROUP_CONCAT ha attributo DISTINCT:

 SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ') FROM table 

L’uso di DISTINCT funzionerà

 SELECT GROUP_CONCAT(DISTINCT(categories) SEPARATOR ' ') FROM table 

REf: – questo

Altre risposte a questa domanda non restituiscono ciò di cui l’OP ha bisogno, restituiranno una stringa come:

 test1 test2 test3 test1 test3 test4 

(notare che test3 e test3 sono duplicati) mentre l’OP vuole restituire questa stringa:

 test1 test2 test3 test4 

il problema qui è che la stringa "test1 test3" è duplicata e viene inserita solo una volta, ma tutti gli altri sono distinti tra loro ( "test1 test2 test3" è distinto da "test1 test3" , anche se alcuni test contenuti nel tutta la stringa è duplicata).

Quello che dobbiamo fare qui è dividere ogni stringa in righe diverse, e prima dobbiamo creare una tabella di numeri:

 CREATE TABLE numbers (n INT); INSERT INTO numbers VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); 

allora possiamo eseguire questa query:

 SELECT SUBSTRING_INDEX( SUBSTRING_INDEX(tableName.categories, ' ', numbers.n), ' ', -1) category FROM numbers INNER JOIN tableName ON LENGTH(tableName.categories)>= LENGTH(REPLACE(tableName.categories, ' ', ''))+numbers.n-1; 

e otteniamo un risultato come questo:

 test1 test4 test1 test1 test2 test3 test3 test3 

e quindi possiamo applicare la funzione di aggregazione GROUP_CONCAT, usando la clausola DISTINCT:

 SELECT GROUP_CONCAT(DISTINCT category ORDER BY category SEPARATOR ' ') FROM ( SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(tableName.categories, ' ', numbers.n), ' ', -1) category FROM numbers INNER JOIN tableName ON LENGTH(tableName.categories)>=LENGTH(REPLACE(tableName.categories, ' ', ''))+numbers.n-1 ) s; 

Per favore, guarda qui .

 SELECT GROUP_CONCAT(DISTINCT (category)) FROM ( SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(tableName.categories, ' ', numbers.n), ' ', -1) category FROM numbers INNER JOIN tableName ON LENGTH(tableName.categories)>=LENGTH(REPLACE(tableName.categories, ' ', ''))+numbers.n-1 ) s; 

Ciò restituirà valori distinti come: test1, test2, test4, test3

Mi rendo conto che questa domanda è vecchia, ma credo che questo dovrebbe essere menzionato: group_concat con distinct = performance killer. Se lavori su piccoli database, non te ne accorgi, ma quando si ridimensiona, non funzionerà molto bene.