2014-01-11 53 views
1

我正在研究一個標籤系統,並且只有一個查詢我不知道。 這是我有:刪除雙重多種方式SQL

表列稱爲標籤,其中有這些東西,例如:
行1:PHP
行2:PHP,HTML
行3:HTML,CSS,JavaScript的
行4:php,css

我可以使用什麼查詢來返回這些4:php,html,javascript和css而沒有其他東西?

在此先感謝!

+3

千萬不要永遠不要在一列中存儲多個值。 就像你現在看到的,這隻會讓你頭痛。首先使表格正常化。 –

+0

是的,正常化是必需的。我相信你的表不會只有你在這個例子中給出的值,而且隨着你的數據增加它會變得更加複雜。 –

+0

在這裏搜索mysql多列值。你會發現許多犯了同樣錯誤的人的問題和答案 –

回答

0

您的存儲標籤的方法真的非常糟糕(正如其他地方指出的那樣)。你應該有一個表post_tags(或類似的東西),每個帖子(或任何)和帖子上的每個標籤都有一行。

雖然有時您無法控制這樣的數據結構。這裏有一個方法可以將前三個標籤從列表中移出。你應該能概括這對於任何有限數量的標籤:

select distinct substring_index(substring_index(tags, ', ', n.n), ', ', -1) as tag 
from table t cross join 
    (select 1 as n union all select 2 union all select 3) n; 
-1

另一種方法

代碼是SQL Server - 需要改變與MySQL

DECLARE @tag_list VARCHAR(MAX) 
DECLARE @tag VARCHAR(MAX) 
DECLARE @tag_part VARCHAR(MAX) 
DECLARE @tag_part_len INT 

DECLARE tag_cursor CURSOR FOR 
SELECT tag 
FROM TagData 

OPEN tag_cursor 

FETCH NEXT FROM tag_cursor 
INTO @tag 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    IF @tag_list IS NULL 
    BEGIN 
     SET @tag_list = @tag 
    END 
    ELSE 
    BEGIN 
     WHILE(LEN(@tag)>0) 
     BEGIN 
      SET @tag_part_len = CHARINDEX(',',@tag,0) 

      IF @tag_part_len = 0 
      BEGIN 
       SET @tag_part_len = LEN(@tag)+1 
       SET @tag_part = SUBSTRING(@tag,0,@tag_part_len) 
       IF CHARINDEX(@tag_part,@tag_list,0) = 0 
        SET @tag_list = @tag_list + ', ' + @tag_part 
       SET @tag = '' 
      END 
      ELSE 
      BEGIN 
       SET @tag_part = SUBSTRING(@tag,0,@tag_part_len) 
       IF CHARINDEX(@tag_part,@tag_list,0) = 0 
        SET @tag_list = @tag_list + ', ' + @tag_part 
       SET @tag = REPLACE(@tag,@tag_part+',','') 
      END 
     END 
    END 
    FETCH NEXT FROM tag_cursor 
    INTO @tag 
END 

CLOSE tag_cursor 
DEALLOCATE tag_cursor 

SELECT @tag_list 
工作