将几个关键字与包含它们的文章匹配,然后按desc排序

时间:2017-05-19 10:47:26

标签: c# sql-server asp.net-mvc entity-framework linq

我试图弄清楚如何解决这个问题,但不能绕过它 - 或找到最好的方法来解决这个问题。我想要实现的是以下(Kw代表关键字)。

所有文章中db的现有kw: Kw1,Kw2,Kw3,Kw4,Kw5

使用关键字的文章

第1条:Kw1,Kw2,Kw3

第2条:Kw1,Kw2,Kw4

第3条:Kw4,Kw1,Kw5

Art4:Kw5,Kw4,Kw2

要匹配的关键字(由用户提交)

Kw1,Kw2,Kw3

根据大多数关键字匹配排名

第1条

第2条

第3和第4条

技术规格

我正在尝试使用带有Entity Framework的ASP.NET MVC项目来实现这一点。该项目连接到一个MS SQL数据库,其中包含一个包含文章的表,另一个表中包含与每篇文章相关的关键字。

我最初的想法是以某种方式使用LINQ,但我发现如果可能的话,很难弄清楚如何做到这一点。

所有帮助让我走上正确的道路,如何解决这个问题将非常感谢!

编辑:数据结构

**KeywordTbl**
[KnowledgeDatabaseKeywordId] INT           IDENTITY (1, 1) NOT NULL,
[Keyword]                    NVARCHAR (64) NOT NULL,
[KnowledgeDatabaseId]        INT           NOT NULL,

**ArticlesTbl**
[KnowledgeDatabaseId] INT             IDENTITY (1, 1) NOT NULL,
[Title]               NVARCHAR (200)  NOT NULL,
[Summary]             NVARCHAR (1000) NOT NULL,
[Article]             NVARCHAR (MAX)  NOT NULL,

示例

**ArticlesTbl**
KnowledgeDatabaseId = 1
Title = "My title"
Summary = "A short summary"
Article = "Longer text"

**KeywordTbl**
KnowledgeDatabaseKeywordId = 1
Keyword = "Kw1"
KnowledgeDatabaseId = 1

KnowledgeDatabaseKeywordId = 2
Keyword = "Kw2"
KnowledgeDatabaseId = 1

1 个答案:

答案 0 :(得分:2)

不知道你的数据结构是什么,这是一个很难回答的问题,但希望以下是一个很好的起点,让你了解SQL如何能够处理你想要的东西。

如果您将Keywords放在Articles旁边的表格中,则可以创建一个Keywords表,以查找临时表,表变量或派生表(我已经使用表变量来编写示例,然后计算从left join返回的所有匹配项:

declare @t table (ArticleID int, Keyword nvarchar(10));
insert into @t values (1,'Kw1'),(1,'Kw2'),(1,'Kw3'),(2,'Kw1'),(2,'Kw2'),(2,'Kw4'),(3,'Kw4'),(3,'Kw1'),(3,'Kw5'),(4,'Kw5'),(4,'Kw4'),(4,'Kw2');

declare @kw table (Keyword nvarchar(10));
insert into @kw values('Kw1'),('Kw2'),('Kw3');

select t.ArticleID
        ,count(k.Keyword) as Matches
from @t t
    left join @kw k
        on(t.Keyword = k.Keyword)
group by t.ArticleID
order by Matches desc
        ,t.ArticleID;

输出:

+-----------+---------+
| ArticleID | Matches |
+-----------+---------+
|         1 |       3 |
|         2 |       2 |
|         3 |       1 |
|         4 |       1 |
+-----------+---------+