[mysql] GROUP_CONCAT ()에서 MySQL DISTINCT

나는하고있다 SELECT GROUP_CONCAT(categories SEPARATOR ' ') FROM table. 아래 샘플 데이터 :

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

그러나, 나는 test1 test2 test3 test4 test1 test3돌아오고있다. 그리고 나는 되돌아 가고 싶다 test1 test2 test3 test4. 어떤 아이디어?

많은 감사합니다!



답변

GROUP_CONCAT 에는 DISTINCT 속성이 있습니다.

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


답변

DISTINCT를 사용하면 작동합니다

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

REf :-


답변

DISTINCT: 고유 한 값을 제공합니다.

SELECT GROUP_CONCAT(DISTINCT(categories )) AS categories FROM table


답변

이 질문에 대한 다른 답변은 OP에 필요한 것을 반환하지 않으며 다음과 같은 문자열을 반환합니다.

test1 test2 test3 test1 test3 test4

(즉, 통지 test1test3영업 이익이 문자열을 반환하고자하는 동안 중복) :

test1 test2 test3 test4

여기서 문제는 문자열 "test1 test3"이 복제되고 한 번만 삽입되지만 다른 모든 문자열 은 서로 구별된다는 "test1 test2 test3"것입니다 ( "test1 test3"전체 문자열에 포함 된 일부 테스트 가 중복 된 경우에도와 는 다릅니다 ).

여기서해야 할 일은 각 문자열을 다른 행으로 나누는 것입니다. 먼저 숫자 테이블을 만들어야합니다.

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

그런 다음이 쿼리를 실행할 수 있습니다.

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;

우리는 다음과 같은 결과를 얻습니다.

test1
test4
test1
test1
test2
test3
test3
test3

DISTINCT 절을 사용하여 GROUP_CONCAT 집계 함수를 적용 할 수 있습니다.

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;

바이올린 여기를 참조 하십시오 .


답변

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;   

test1, test2, test4, test3 과 같은 고유 값을 반환합니다.


답변

DISTINCT 를 앞에 추가하면 됩니다.

SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')

정렬하려면

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


답변