MySQL DISTINCT บน GROUP_CONCAT ()


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กลับไป ความคิดใด ๆ

ขอบคุณมาก!

คำตอบ:




20

DISTINCT: จะให้คุณค่าที่เป็นเอกลักษณ์แก่คุณ

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

17

คำตอบอื่น ๆ สำหรับคำถามนี้ไม่ส่งคืนสิ่งที่ OP ต้องการพวกเขาจะส่งคืนสตริงดังนี้

test1 test2 test3 test1 test3 test4

(สังเกตว่าtest1และtest3ทำซ้ำ) ในขณะที่ OP ต้องการส่งคืนสตริงนี้:

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

และจากนั้นเราสามารถใช้ฟังก์ชันการรวม GROUP_CONCAT โดยใช้คำสั่ง 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;

โปรดดูซอนี่


ดูเหมือนว่าการตีความคำถาม OP ของคุณอาจถูกต้อง อย่างไรก็ตามฉันคิดว่าควรชี้ให้เห็นว่าการทำให้ข้อมูลเป็นปกติด้วยการสร้างตาราง "blah_to_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.