我真的不擅长 SQL,我想知道我可以运行什么 SQL 来解决下面的问题,我怀疑这是一个 NP 完全问题,但我可以接受查询需要很长时间才能在大型数据集上运行因为这将作为后台任务完成。首选标准 SQL 语句,但如果需要存储过程,那就这样吧。 SQL 需要在 Postgres 9.3 上运行。
问题:给定一组包含一组关键字的文章,找到每篇文章中包含最多匹配关键字的前 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;
query:
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