我正在研究标签系统,只有一个我无法弄清楚的查询。 这就是我所拥有的:
表格列称为标签,例如:
第1行:php
第2行:php,html
第3行:html,css,javascript
第4行:php,css
我可以使用什么查询来返回这些4:php,html,javascript和css而不是其他内容?
提前致谢!
答案 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