我正在研究一個標籤系統,並且只有一個查詢我不知道。 這是我有:刪除雙重多種方式SQL
表列稱爲標籤,其中有這些東西,例如:
行1:PHP
行2:PHP,HTML
行3:HTML,CSS,JavaScript的
行4:php,css
我可以使用什麼查詢來返回這些4:php,html,javascript和css而沒有其他東西?
在此先感謝!
我正在研究一個標籤系統,並且只有一個查詢我不知道。 這是我有:刪除雙重多種方式SQL
表列稱爲標籤,其中有這些東西,例如:
行1:PHP
行2:PHP,HTML
行3:HTML,CSS,JavaScript的
行4:php,css
我可以使用什麼查詢來返回這些4:php,html,javascript和css而沒有其他東西?
在此先感謝!
您的存儲標籤的方法真的非常糟糕(正如其他地方指出的那樣)。你應該有一個表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;
另一種方法
代碼是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
工作
千萬不要永遠不要在一列中存儲多個值。 就像你現在看到的,這隻會讓你頭痛。首先使表格正常化。 –
是的,正常化是必需的。我相信你的表不會只有你在這個例子中給出的值,而且隨着你的數據增加它會變得更加複雜。 –
在這裏搜索mysql多列值。你會發現許多犯了同樣錯誤的人的問題和答案 –