私は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
この質問に対する他の回答は、OPが必要とするものを返さず、次のような文字列を返します。
test1 test2 test3 test1 test3 test4
(test1
とtest3
が重複していることに注意してください)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;
フィドル こちら をご覧ください。
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
DISTINCT
:一意の値を提供します。
SELECT GROUP_CONCAT(DISTINCT(categories )) AS categories FROM table
前にDISTINCTを追加するだけです。
SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')
ソートしたい場合は、
SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ')
私はこの質問が古いことを理解していますが、これについて言及すべきだと感じています:group = concat with distinct = performance killer。小規模なデータベースで作業している場合は気付かないでしょうが、規模が大きくなるとうまく機能しません。