我试图弄清楚如何解决这个问题,但不能绕过它 - 或找到最好的方法来解决这个问题。我想要实现的是以下(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
答案 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 |
+-----------+---------+