web-dev-qa-db-ja.com

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を取得したいと思います。何か案は?

どうもありがとう!

162
user371990

GROUP_CONCAT にはDISTINCT属性があります:

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

DISTINCTを使用すると動作します

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

REf:- this

45
Salil

この質問に対する他の回答は、OPが必要とするものを返さず、次のような文字列を返します。

test1 test2 test3 test1 test3 test4

test1test3が重複していることに注意してください)OPがこの文字列を返したい場合:

test1 test2 test3 test4

ここでの問題は、文字列"test1 test3"が複製されて1回だけ挿入されることですが、他のすべては互いに異なる(一部のテストが含まれていても、"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;

フィドル こちら をご覧ください。

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;   

これにより、次のような個別の値が返されます。test1、test2、test4、test

11
Sainath

DISTINCT:一意の値を提供します。

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

前にDISTINCTを追加するだけです。

SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')

ソートしたい場合は、

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

私はこの質問が古いことを理解していますが、これについて言及すべきだと感じています:group = concat with distinct = performance killer。小規模なデータベースで作業している場合は気付かないでしょうが、規模が大きくなるとうまく機能しません。

1
photocode