MySQL DISTINCT pada GROUP_CONCAT ()


186

Saya lakukan SELECT GROUP_CONCAT(categories SEPARATOR ' ') FROM table. Contoh data di bawah:

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

Namun, saya akan test1 test2 test3 test4 test1 test3kembali dan saya ingin test1 test2 test3 test4kembali. Ada ide?

Terimakasih banyak!

Jawaban:


364

GROUP_CONCAT memiliki atribut DISTINCT:

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

48

Menggunakan DISTINCT akan bekerja

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

REf: - ini


20

DISTINCT: akan memberi Anda nilai-nilai unik.

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

17

Jawaban lain untuk pertanyaan ini tidak mengembalikan apa yang dibutuhkan OP, mereka akan mengembalikan string seperti:

test1 test2 test3 test1 test3 test4

(perhatikan itu test1dan test3digandakan) sementara OP ingin mengembalikan string ini:

test1 test2 test3 test4

Masalahnya di sini adalah bahwa string "test1 test3"digandakan dan dimasukkan hanya sekali, tetapi semua yang lain berbeda satu sama lain ( "test1 test2 test3"berbeda dari "test1 test3", bahkan jika beberapa tes yang terkandung dalam seluruh string digandakan).

Apa yang perlu kita lakukan di sini adalah untuk membagi setiap string menjadi baris yang berbeda, dan pertama-tama kita perlu membuat tabel angka:

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

maka kita dapat menjalankan kueri ini:

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;

dan kami mendapatkan hasil seperti ini:

test1
test4
test1
test1
test2
test3
test3
test3

dan kemudian kita dapat menerapkan fungsi agregat GROUP_CONCAT, menggunakan klausa DISTINCT:

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;

Silakan lihat biola di sini .


Tampaknya penafsiran Anda tentang pertanyaan OP mungkin benar; namun, saya pikir harus ditunjukkan bahwa menormalkan data dengan membuat tabel "blah_to_categories" dan "kategori" untuk hubungan banyak-ke-banyak yang sesuai akan menjadi praktik terbaik di sini, dan akan menambah banyak fleksibilitas. Meski begitu, jawaban Anda adalah solusi cerdas bagi siapa saja yang mewarisi skema denormalized tersebut. Mungkin juga bisa diadaptasi untuk tujuan menghasilkan migrasi dari skema lama ke skema normal.
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;   

Ini akan mengembalikan nilai yang berbeda seperti: test1, test2, test4, test3


6

Anda cukup menambahkan DISTINCT di depan.

SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')

jika Anda ingin menyortir,

SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ')
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.