web-dev-qa-db-fra.com

MySQL DISTINCT sur un GROUP_CONCAT ()

Je fais SELECT GROUP_CONCAT(categories SEPARATOR ' ') FROM table. Exemple de données ci-dessous:

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

Cependant, je récupère test1 test2 test3 test4 test1 test3 et je voudrais récupérer test1 test2 test3 test4. Des idées?

Merci beaucoup!

162
user371990

GROUP_CONCAT possède l'attribut DISTINCT:

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

Utiliser DISTINCT fonctionnera

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

REf: - this

45
Salil

Les autres réponses à cette question ne renvoient pas ce dont le PO a besoin, elles renverront une chaîne du type:

test1 test2 test3 test1 test3 test4

(notez que test1 et test3 sont dupliqués) pendant que l'OP souhaite renvoyer cette chaîne:

test1 test2 test3 test4

le problème ici est que la chaîne "test1 test3" est dupliquée et insérée une seule fois, mais que toutes les autres sont distinctes les unes des autres ("test1 test2 test3" est distinct de "test1 test3", même si certains tests en contiennent dans la chaîne entière sont dupliqués).

Ce que nous devons faire ici est de scinder chaque chaîne en différentes lignes et nous devons d’abord créer un tableau de nombres:

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

alors nous pouvons exécuter cette requête:

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;

et nous obtenons un résultat comme celui-ci:

test1
test4
test1
test1
test2
test3
test3
test3

et ensuite nous pouvons appliquer la fonction d'agrégation GROUP_CONCAT, en utilisant la clause 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;

S'il vous plaît voir le violon ici .

16
fthiella
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;   

Cela retournera des valeurs distinctes comme: test1, test2, test4, test

11
Sainath

DISTINCT: vous donnera des valeurs uniques.

SELECT GROUP_CONCAT(DISTINCT(categories )) AS categories FROM table
7
Goshika Mahesh

Vous pouvez simplement ajouter DISTINCT devant.

SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')

si vous voulez trier,

SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ')
2

Je me rends compte que cette question est ancienne, mais j’ai le sentiment qu’il faille en parler: group_concat avec distinct = performance killer. Si vous travaillez dans de petites bases de données, vous ne le remarquerez pas, mais lorsque cela évoluera, cela ne fonctionnera pas très bien.

1
photocode