删除双倍多路SQL

时间:2014-01-11 20:03:38

标签: mysql sql

我正在研究标签系统,只有一个我无法弄清楚的查询。 这就是我所拥有的:

表格列称为标签,例如:
第1行:php
第2行:php,html
第3行:html,css,javascript
第4行:php,css

我可以使用什么查询来返回这些4:php,html,javascript和css而不是其他内容?

提前致谢!

2 个答案:

答案 0 :(得分: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 :(得分:-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