對這個問題的其他答案不回什麼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;
請參閱小提琴here。
看來你對OP問題的解釋可能是對的;然而,我認爲應該指出的是,通過爲適當的多對多關係創建「blah_to_categories」和「類別」表來規範化數據將是最佳實踐,並且會增加很多靈活性。儘管如此,對於繼承這種非規範化模式的人來說,您的答案是一個明智的解決方法。它也可能適用於產生從舊模式向正常模式遷移的目的。 – XP84 2016-06-01 17:11:14