如何从数据库中检索样本?

时间:2013-08-17 13:53:51

标签: sql database database-design rdbms

假设我有许多标记实体(例如带有标签的博客文章)存储在SQL数据库中。例如:

post1: work
post2: work, programming, java, work
post3: work, programming, sql
post4: vacation, photo
post5: vacation
post6: photo

假设我还有一个标签列表

work, vacation

现在我想获得一个大小为2的帖子 sample ,即列表中带有标签的两个帖子。例如

sample1: post1 and post2
sample2: post1 and post4
sample3: post2 and post5

此外,我希望示例包含列表中的所有标记。请注意,sample1不符合此要求,因为示例实体的标记集不包含列表中的标记vacation

我也希望所有标签出现都相同。让我们考虑2个4号样本。

sample1: post1, post2, post3, post6
sample2: post1, post3, post4, post5

请注意,sample1不符合此要求,因为标记work中出现了3次,vacation只出现一次。

我的问题是:如何设计关系数据库和SQL查询来检索给定大小的样本?

1 个答案:

答案 0 :(得分:1)

如果您想获取所有包含逗号分隔列表标签的帖子:

select postid
from post_tags
where find_in_set(tagid, @LIST) > 0
group by postid
having count(distinct tagid) = 1+length(@LIST) - length(replace(',', @LIST, ''));

如果你只想要一个“样本”:

select postid
from (select postid
      from post_tags
      where find_in_set(tagid, @LIST) > 0
      group by postid
      having count(distinct tagid) = 1+length(@LIST) - length(replace(',', @LIST, ''))
     ) t
order by rand()
limit 5