假设我有许多标记实体(例如带有标签的博客文章)存储在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查询来检索给定大小的样本?
答案 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