คำตอบอื่น ๆ สำหรับคำถามนี้ไม่ส่งคืนสิ่งที่ 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;
โปรดดูซอนี่