0

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

post1:工作
post2:工作、编程、java、工作
post3:工作、编程、sql
post4:假期,照片
post5:假期
帖子6:照片

假设我还有一个标签列表

工作,假期

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

示例 1:post1 和 post2
示例 2:post1 和 post4
示例 3:post2 和 post5

此外,我希望样本包含列表中的所有标签。请注意,sample1不满足此要求,因为示例实体的标签集不包含vacation列表中的标签。

我也希望所有标签的出现都是平等的。让我们考虑 2 个大小为 4 的样本。

示例 1:post1、post2、post3、post6
示例 2:post1、post3、post4、post5

请注意,sample1不满足此要求,因为标签work在其中出现了 3 次,并且vacation只出现了一次。

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

4

1 回答 1

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
于 2013-08-17T14:11:02.983 回答