【发布时间】:2020-02-07 01:40:03
【问题描述】:
假设我有一个代表图书馆的数据库,以及一个存储每本书中单词的表。让我们称表为“books”,并说它有这样的行:
| book_name | word_in_book | word |
|-----------|--------------|---------|
| Moby Dick | 1 | call |
| Moby Dick | 2 | me |
| Moby Dick | 3 | ishmael |
如果我有一个想要查找的单词序列(可以是任意数量的单词),我可以运行什么 SQL 查询来返回具有该单词序列的 book_names 列表,其中 @987654324 @是连续的?例如,如果我有列表 ["call", "me", "ishmael"],则查询将返回“Moby Dick”,因为这本书按顺序排列了该单词序列。但是,使用 ["call", "me", "ahab"] 运行它不会返回该书,因为这些单词不是书中单词的子数组(因此它应该只返回具有匹配子数组的书籍,不是匹配的子序列)。
我正在使用 knex 和 Express 来构建我的 SQL 语句。我的预感是我需要使用 knex 来遍历要搜索的单词数组,并为每个单词在我的查询对象中添加一些内容,但我不知道该怎么做。
到目前为止,我能想到的只有这些:
const knex = require("knex")({
// Connection details here ...
});
const words = ["call", "me", "ishmael"];
let query = knex("books");
words.forEach(word => {
query = ??? // Not sure how to build my query
});
我在工作中使用的真实数据库与此非常相似。不同的是有几千本书,但每本书没有那么多字(最多只有几百个)。问题是,选择每本书的所有内容并使用 JavaScript 检查所有单词会很慢,所以我希望 knex/SQL 尽可能多地完成工作。最好的方法是什么?
【问题讨论】:
标签: javascript sql knex.js