【发布时间】:2016-01-31 09:07:55
【问题描述】:
让我们想象一下抽象数据库,它包含带有附加标签的对象(默认为多对多与附加表的关系)。现在,我们有一个用户,他想要找到与他提供的 最多 个标签匹配的对象,并按相关性排序。例如:
Object1: TagA, TagB, TagC, TagD
Object2: TagA, TagC, TagD
Object3: TagB, TagD, TagE, TagF
Object4: TagA, TagB, TagC, TagE
用户请求 TagB、TagC、TagD 预期结果应如下所示:
Object1 (3 matches)
Object4 (2 matches)
Object2 (2 matches)
Object3 (1 match)
编辑: 示例结构(我在 SQLite 中创建它,但我们可以放心地假设为 MSSql)
CREATE TABLE Objects(Id int not null primary key, Name text);
CREATE TABLE Tags(Id int not null primary key, Name text);
CREATE TABLE ObjectTag(Id int not null primary key, ObjectId int, TagId int);
INSERT INTO Objects(Id, Name) VALUES (1, "Object1");
INSERT INTO Objects(Id, Name) VALUES (2, "Object2");
INSERT INTO Objects(Id, Name) VALUES (3, "Object3");
INSERT INTO Objects(Id, Name) VALUES (4, "Object4");
INSERT INTO Tags(Id, Name) VALUES (1, "TagA");
INSERT INTO Tags(Id, Name) VALUES (2, "TagB");
INSERT INTO Tags(Id, Name) VALUES (3, "TagC");
INSERT INTO Tags(Id, Name) VALUES (4, "TagD");
INSERT INTO Tags(Id, Name) VALUES (5, "TagE");
INSERT INTO Tags(Id, Name) VALUES (6, "TagF");
INSERT INTO ObjectTag(Id, ObjectId, TagId) VALUES (1, 1, 1);
INSERT INTO ObjectTag(Id, ObjectId, TagId) VALUES (2, 1, 2);
INSERT INTO ObjectTag(Id, ObjectId, TagId) VALUES (3, 1, 3);
INSERT INTO ObjectTag(Id, ObjectId, TagId) VALUES (4, 1, 4);
INSERT INTO ObjectTag(Id, ObjectId, TagId) VALUES (5, 2, 1);
INSERT INTO ObjectTag(Id, ObjectId, TagId) VALUES (6, 2, 3);
INSERT INTO ObjectTag(Id, ObjectId, TagId) VALUES (7, 2, 4);
INSERT INTO ObjectTag(Id, ObjectId, TagId) VALUES (8, 3, 2);
INSERT INTO ObjectTag(Id, ObjectId, TagId) VALUES (9, 3, 4);
INSERT INTO ObjectTag(Id, ObjectId, TagId) VALUES (10, 3, 5);
INSERT INTO ObjectTag(Id, ObjectId, TagId) VALUES (11, 3, 6);
INSERT INTO ObjectTag(Id, ObjectId, TagId) VALUES (12, 4, 1);
INSERT INTO ObjectTag(Id, ObjectId, TagId) VALUES (13, 4, 2);
INSERT INTO ObjectTag(Id, ObjectId, TagId) VALUES (14, 4, 3);
INSERT INTO ObjectTag(Id, ObjectId, TagId) VALUES (15, 4, 5);
预期结果(查询“TagB、TagC、TagD”):
ObjectName | MatchCount
-----------+-----------
Object1 | 3
Object4 | 2
Object2 | 2
Object3 | 1
【问题讨论】:
-
您能分享一下您的表格结构吗?另外,你用的是什么rdbms?