从表中选择不同的值

时间:2014-06-01 16:18:15

标签: sql select tags distinct

我有一个表格,我存储了我的博客文章, 结构是这样的:

id,title,description,tags..

在标签列中,数据的存储方式如下:tag1,tag2,tag3,tag4.

我想从我的所有文章中选择所有不同的标签

ex:
article 1 :tags1,tags2,tags3,tags,4
article 2 : tags 1,tags4,tag5,tags 6

After query :
tags1,tag2,tags3,tags4,tags5,tags6

我该怎么做?

2 个答案:

答案 0 :(得分:0)

这个丑陋的查询在一篇文章中最多可以使用8个标签,但如果需要,可以添加更多的SELECT UNION。

由于你没有提供表名,我猜到了“文章”。

SELECT
  DISTINCT(Tags)
FROM
(SELECT TRIM(SUBSTRING_INDEX(Article.Tags, ',', 1)) AS Tags FROM Article UNION
 SELECT TRIM(SUBSTRING(SUBSTRING_INDEX(Article.Tags, ',', 2), LENGTH(SUBSTRING_INDEX(Article.Tags, ',', 1))+2)) FROM Article UNION
 SELECT TRIM(SUBSTRING(SUBSTRING_INDEX(Article.Tags, ',', 3), LENGTH(SUBSTRING_INDEX(Article.Tags, ',', 2))+2)) FROM Article UNION
 SELECT TRIM(SUBSTRING(SUBSTRING_INDEX(Article.Tags, ',', 4), LENGTH(SUBSTRING_INDEX(Article.Tags, ',', 3))+2)) FROM Article UNION
 SELECT TRIM(SUBSTRING(SUBSTRING_INDEX(Article.Tags, ',', 5), LENGTH(SUBSTRING_INDEX(Article.Tags, ',', 4))+2)) FROM Article UNION
 SELECT TRIM(SUBSTRING(SUBSTRING_INDEX(Article.Tags, ',', 6), LENGTH(SUBSTRING_INDEX(Article.Tags, ',', 5))+2)) FROM Article UNION
 SELECT TRIM(SUBSTRING(SUBSTRING_INDEX(Article.Tags, ',', 7), LENGTH(SUBSTRING_INDEX(Article.Tags, ',', 6))+2)) FROM Article UNION
 SELECT TRIM(SUBSTRING(SUBSTRING_INDEX(Article.Tags, ',', 8), LENGTH(SUBSTRING_INDEX(Article.Tags, ',', 7))+2)) FROM Article
 -- This query will work for a max number of 8 tags in one article : add more SELECT UNION if needed
 )
AS AllTags

作为旁注,我完全同意GolezTrol,你真的应该考虑将你的标签存储在一个单独的表中。

答案 1 :(得分:-1)

你应该有一个标签表,以及一个关联表,你可以在其中存储标签和文章之间的关联。