MySQL DISTINCT bir GROUP_CONCAT üzerinde ()


186

Ben yapıyorum SELECT GROUP_CONCAT(categories SEPARATOR ' ') FROM table. Aşağıdaki örnek veriler:

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

Ancak test1 test2 test3 test4 test1 test3geri dönüyorum ve geri dönmek istiyorum test1 test2 test3 test4. Herhangi bir fikir?

Çok teşekkürler!

Yanıtlar:


364

GROUP_CONCAT DISTINCT özelliğine sahip:

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

48

DISTINCT kullanımı işe yarayacak

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

REf: - bu


20

DISTINCT: will size benzersiz değerler verir.

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

17

Bu sorunun diğer cevapları OP'nin ihtiyaç duyduğu şeyleri döndürmez, şöyle bir dize döndürür:

test1 test2 test3 test1 test3 test4

(buna dikkat edin test1ve test3çoğaltılır) OP bu dizeyi döndürmek ister:

test1 test2 test3 test4

Buradaki sorun, dizenin "test1 test3"çoğaltılması ve yalnızca bir kez eklenmesidir, ancak diğerlerinin tümü birbirinden farklıdır ( dizenin tamamında bulunan bazı testler çoğaltılmış olsa bile "test1 test2 test3"farklıdır "test1 test3").

Burada yapmamız gereken her dizeyi farklı satırlara ayırmak ve önce bir sayı tablosu oluşturmamız gerekiyor:

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

o zaman bu sorguyu çalıştırabiliriz:

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;

ve bunun gibi bir sonuç elde ediyoruz:

test1
test4
test1
test1
test2
test3
test3
test3

ve sonra DISTINCT deyimini kullanarak GROUP_CONCAT toplama işlevini uygulayabiliriz:

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;

Lütfen buraya bakın .


OP'nin sorusunu yorumlamanız doğru olabilir; ancak, uygun çoktan çoğa ilişki için bir "blah_to_categories" ve "kategoriler" tablosu oluşturarak verilerin normalleştirilmesinin burada en iyi uygulama olacağını ve çok fazla esneklik ekleyeceğini belirtmek gerekir. Yine de, cevabınız böyle denormalize bir şemayı devralan herkes için akıllı bir çözümdür. Muhtemelen eskiden normalleştirilmiş şemaya göç etmek amacıyla da adapte edilebilir.
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;   

Bu, test1, test2, test4, test3 gibi farklı değerler döndürür.


6

Önde DISTINCT ekleyebilirsiniz .

SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')

sıralamak istiyorsan,

SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.