GROUP_CONCAT ()에서 MySQL DISTINCT


186

나는하고있다 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. 어떤 아이디어?

많은 감사합니다!

답변:


363

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

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

48

DISTINCT를 사용하면 작동합니다

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

REf :-


20

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

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

17

이 질문에 대한 다른 답변은 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;

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


OP의 질문에 대한 귀하의 해석이 옳은 것 같습니다. 그러나 적절한 다 대다 관계에 대해 "blah_to_categories"및 "categories"테이블을 작성하여 데이터를 정규화하는 것이 가장 좋은 방법이며 많은 유연성이 추가 될 것입니다. 그럼에도 불구하고 귀하의 답변은 그러한 비정규 화 된 스키마를 상속받는 사람에게는 현명한 해결책입니다. 또한 이전 스키마에서 정규화 된 스키마로 마이그레이션을 생성 할 목적으로 조정될 수도 있습니다.
XP84

11
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 과 같은 고유 값을 반환합니다.


6

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

SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')

정렬하려면

SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.