我对SQL非常不满,我想知道我可以运行哪些SQL来解决下面我怀疑是NP-Complete问题的问题,但我是确定查询需要很长时间才能运行大型数据集,因为这将作为后台任务完成。一个标准的sql语句是首选,但如果需要存储过程,那就这样吧。 SQL需要在Postgres 9.3上运行。SQL查询查找具有最匹配关键字的行
问题:给定一组包含一组关键字的文章,找到包含最多匹配关键字的每篇文章的前n篇文章。
一个下调的文章表的版本是这样的:
CREATE TABLE article (
id character varying(36) NOT NULL, -- primary key of article
keywords character varying, -- comma separated set of keywords
CONSTRAINT pk_article PRIMARY KEY (id)
);
-- Test Data
INSERT INTO article(id, keywords) VALUES(0, 'red,green,blue');
INSERT INTO article(id, keywords) VALUES(1, 'red,green,yellow');
INSERT INTO article(id, keywords) VALUES(2, 'purple,orange,blue');
INSERT INTO article(id, keywords) VALUES(3, 'lime,violet,ruby,teal');
INSERT INTO article(id, keywords) VALUES(4, 'red,green,blue,yellow');
INSERT INTO article(id, keywords) VALUES(5, 'yellow,brown,black');
INSERT INTO article(id, keywords) VALUES(6, 'black,white,blue');
这将导致这对SELECT * FROM article;
查询:
Table: article
------------------------
id keywords
------------------------
0 red,green,blue
1 red,green,yellow
2 purple,orange,blue
3 lime,violet,ruby,teal
4 red,green,blue,yellow
5 yellow,brown,black
6 black,white,blue
假设我想找到的前3篇每条包含最多匹配关键字的文章,那么输出应该是这样的:
------------------------
id related
------------------------
0 4,1,6
1 4,0,5
2 0,4,6
3 null
4 0,1,6
5 1,6
6 5,0,4
您应该**从不**将逗号分隔值存储在单个列中。如果您规范化模型,查询变得非常简单。 –
如果需要的话,我可以把关键字分割到自己的表中。这只是我懒惰得到这个工作的结果。 –
你应该。您还在限制您的关键字,如果您的关键字名称很长,该怎么办?将有一个大的表现增加。 –