大多数匹配标记的SQL查询

大多数匹配标记的SQL查询,sql,tags,Sql,Tags,让我们想象一下抽象数据库,它包含带有附加标记的对象(默认多对多关系和附加表)。现在,我们有一个用户,他希望找到与他提供的大多数标记相匹配的对象,并按相关性排序。例如: Object1: TagA, TagB, TagC, TagD Object2: TagA, TagC, TagD Object3: TagB, TagD, TagE, TagF Object4: TagA, TagB, TagC, TagE 用户要求标记B、标记C、标记D 预期结

让我们想象一下抽象数据库,它包含带有附加标记的对象(默认多对多关系和附加表)。现在,我们有一个用户,他希望找到与他提供的大多数标记相匹配的对象,并按相关性排序。例如:

Object1: TagA, TagB, TagC, TagD
Object2: TagA,       TagC, TagD
Object3: TagB,             TagD, TagE, TagF
Object4: TagA, TagB, TagC,       TagE
用户要求标记B、标记C、标记D 预期结果应如下所示:

Object1 (3 matches)
Object4 (2 matches)
Object2 (2 matches)
Object3 (1 match)

编辑:示例结构(我在SQLite中创建了它,但我们可以安全地假设MSSql)

预期结果(对于查询“TagB、TagC、TagD”):


不确定您的表结构,但从您的帖子来看,您可以使用
groupby
来实现类似的功能

select object, count(tag) as tagcount
from tags
where tag in ('TagB', 'TagC', 'TagD')
group by object;
以下是答案:

SELECT t1.name, COUNT(t1.tag) as count FROM
    (SELECT o.Name as name, 
        1 as tag 
     FROM Objects AS o,
        ObjectTag AS ot 
     WHERE o.Id = ot.ObjectId 
         AND ot.TagId IN (2,3,4)) AS t1
     GROUP BY t1.name
     ORDER BY count DESC

你能分享一下你的桌子结构吗?还有,你在用什么?
select object, count(tag) as tagcount
from tags
where tag in ('TagB', 'TagC', 'TagD')
group by object;
SELECT t1.name, COUNT(t1.tag) as count FROM
    (SELECT o.Name as name, 
        1 as tag 
     FROM Objects AS o,
        ObjectTag AS ot 
     WHERE o.Id = ot.ObjectId 
         AND ot.TagId IN (2,3,4)) AS t1
     GROUP BY t1.name
     ORDER BY count DESC