2013-04-22 34 views
4

我不確定這是否可以用純SQL(MySQL)實現,但我仍然會問。我有這樣一個表:MySql獲取表中唯一字的列表,其中用逗號分隔的字段中的值

ID TAGS 
----------------------------- 
1  word1,word2,word3 
2  word2,word4 
3  word3,word5,word6,word7 
... 

我想選擇標籤領域的所有獨特的話,要走出這樣的事情:

TAGS 
----- 
word1 
word2 
word3 
word4 
word5 
word6 
word7 
+0

有沒有在'tags'列字的最大值是多少? – 2013-04-22 18:23:22

+1

這在應用程序級別上更容易完成。 – Strawberry 2013-04-22 18:26:15

+0

提交本身是文本類型,所以它限於什麼可以容納在這種類型 – 2013-04-22 18:27:04

回答

3

你可以在SQL中做到這一點,雖然它不漂亮。

select distinct reverse(substring_index(reverse(substring_index(tags, ',', n.n)), ',', 1)) as word 
from t cross join 
    (select 1 as n union all select 2 as n union all select 3 as n union all select 4 as n) n 
having word is not null 

您需要確保該子查詢n在每個標籤的話至少數。

Here是演示這一點的SQLFiddle。

這是交叉連接原始數據與序號。然後使用substring_index()從標籤字符串中挑選第n個值。

要獲取標籤的最大數量,你可以這樣做:

select max(length(tags) - length(replace(tags, ',', 1))+1 
from t 
+0

這不起作用,我得到2行,一個空和第二個NULL。 – 2013-04-22 18:41:54

+0

@PrimozRome。 。 。表達式應該是'substring_index(substring_index(。。。))'。我解決了這個問題並添加了'having'子句來消除'NULL'。 – 2013-04-22 18:45:39

+0

看起來更好,但它只輸出一行= word1 – 2013-04-22 18:49:33

0

唯一的辦法我能想到這樣做的在數據庫中有一個存儲過程,這個存儲過程將迭代每一行,提取並分析它的內容,所以它不會非常高效。

+0

是的,我想是這樣,所以我想這是相同的,如果我在我的應用程序內執行它... – 2013-04-22 18:29:22

相關問題