首先我需要说的是,虽然我接受过关系代数教育,但我可以安全地假设我没有正式的SQL教育。
我正在研究解决以下问题的最佳方法。
我们的数据库为每个文本保留文本和关键字。
Articles
id | text
Keywords
id | word
Articles_keywords
id_article | id_keyword
为了这个问题,答案的提供者可以假设表被索引但是有人想要。
所以问题是获取所有具有特定关键字的文章。
我已经与两组人进行了交谈,他们以两种方式解决了这个问题,他们都声称其他群体的做法是错误的。
使用IN运算符的第一个解决方案:
SELECT * FROM Articles AS a WHERE a.id IN
(SELECT id_article FROM Articles_Keywords AS ak WHERE ak.id_keyword IN
(SELECT id FROM keywords AS k WHERE k.word = 'xyz'));
其他解决方案当然是使用JOIN运算符:
SELECT * FROM Articles as a
JOIN Articles_Keywords as ak
ON a.id = ak.id_article
JOIN Keywords as k
ON k.id = ak.id_keyword
WHERE k.word = 'xyz';
哪种方法更好,最重要的是,为什么?
修改
在articles表中,我们有一个唯一的id列,只是为了这个问题,我们可以假设没有重复的文本。
关键字表也是如此。
在article_keywords表中,有序对(id_article,id_keyword)是唯一的