KnexJS 如何创建多个内部连接
KnexJS How to create multiple inner join
我需要将此 SQL 查询转换为 KnexJS 查询
SELECT
Book.Title,
Book.Number,
Author.Name,
Author_1.Name,
Author_2.Name,
Author_3.Name
FROM
((((Book)
INNER JOIN Author ON Book.AuthName = Author.Name)
INNER JOIN Author AS Author_1 ON Book.AuthName = Author_1.Name)
INNER JOIN Author AS Author_2 ON Book.AuthName = Author_2.Name)
INNER JOIN Author AS Author_3 ON Book.AuthName = Author_3.Name
WHERE Book.Title = "HelpMe" ORDER BY Book.Number;
我已经阅读了这里的文档 https://knexjs.org/#Builder-join 但我几乎不明白如何使用给定的示例来满足我的需要,因为没有此类多重内部连接的示例。
请帮帮我
Knex 连接是可链接的,所以你可以做这样的事情:
knex
.select('title', 'author1', 'author2')
.from('books')
.join('authors as author1', 'books.author_name', '=', 'author1.name')
.join('authors as author2', 'books.author_name', '=', 'author2.name')
我怀疑你的例子有问题,因为你 运行 一遍又一遍地进行基本相同的比较。通常你会 link 到 authors
table 使用一系列外键(author1id
, author2id
)或者更恰当的是连接 table 因为这是多对多关系:
knex
.select('books.title', 'authors.name')
.from('books')
.join('books_authors', 'books.id', '=', 'books_authors.book_id')
.join('authors', 'authors.id', '=', 'books_authors.author_id')
这会获取该书的所有作者,无论有多少,但需要额外的 table 仅包含 id:
exports.up = knex =>
knex.schema.createTable('books_authors', t => {
t.integer('book_id').references('books.id')
t.integer('author_id').references('authors.id')
})
exports.down = knex => knex.schema.dropTable('books_authors')
每次您将作者添加到一本书中时,您还需要将这本书的 ID 和作者的 ID 添加到连接 table 中,以便两者之间存在关系。这样,每本书可以有一个或一百个作者。
我需要将此 SQL 查询转换为 KnexJS 查询
SELECT
Book.Title,
Book.Number,
Author.Name,
Author_1.Name,
Author_2.Name,
Author_3.Name
FROM
((((Book)
INNER JOIN Author ON Book.AuthName = Author.Name)
INNER JOIN Author AS Author_1 ON Book.AuthName = Author_1.Name)
INNER JOIN Author AS Author_2 ON Book.AuthName = Author_2.Name)
INNER JOIN Author AS Author_3 ON Book.AuthName = Author_3.Name
WHERE Book.Title = "HelpMe" ORDER BY Book.Number;
我已经阅读了这里的文档 https://knexjs.org/#Builder-join 但我几乎不明白如何使用给定的示例来满足我的需要,因为没有此类多重内部连接的示例。
请帮帮我
Knex 连接是可链接的,所以你可以做这样的事情:
knex
.select('title', 'author1', 'author2')
.from('books')
.join('authors as author1', 'books.author_name', '=', 'author1.name')
.join('authors as author2', 'books.author_name', '=', 'author2.name')
我怀疑你的例子有问题,因为你 运行 一遍又一遍地进行基本相同的比较。通常你会 link 到 authors
table 使用一系列外键(author1id
, author2id
)或者更恰当的是连接 table 因为这是多对多关系:
knex
.select('books.title', 'authors.name')
.from('books')
.join('books_authors', 'books.id', '=', 'books_authors.book_id')
.join('authors', 'authors.id', '=', 'books_authors.author_id')
这会获取该书的所有作者,无论有多少,但需要额外的 table 仅包含 id:
exports.up = knex =>
knex.schema.createTable('books_authors', t => {
t.integer('book_id').references('books.id')
t.integer('author_id').references('authors.id')
})
exports.down = knex => knex.schema.dropTable('books_authors')
每次您将作者添加到一本书中时,您还需要将这本书的 ID 和作者的 ID 添加到连接 table 中,以便两者之间存在关系。这样,每本书可以有一个或一百个作者。