gpt4 book ai didi

node.js - Sequelize - 排序和排除

转载 作者:行者123 更新时间:2023-12-03 22:18:22 30 4
gpt4 key购买 nike

我有一个带有两个表的外键的项目表,我尝试使用 order、limit、exclude 和 include 执行 FindAll,如下所示:

Items.findAll({
order: [['creationDate', 'DESC']],
limit: 10,
include: [
{
model: Artists,
required: false,
attributes: ['id', 'name',]
},
{
model: Albums,
required: false,
},
],
attributes: { exclude: ['creationDate'] }
})
但我收到一个错误:
DatabaseError [SequelizeDatabaseError]: (conn = 837, no: 1054, SQLState: 42S22) Unknown column 'Items.creationDate' in 'order clause'
如果我删除这一行:
    attributes: { exclude: ['creationDate'] }
错误消失。
我应该怎么做才能启用具有所需属性的查询?
提前致谢

最佳答案

findAllinclude 尝试组合来自多个表的数据。在 SQL 中,子查询和 JOIN 都实现了这个用例。但是,数据的组合方式与您在此处看到的情况略有不同。默认情况下,Sequelize 为 findAll + include 生成子查询,subQuery 参数是告诉 Sequelize 使用 Subquery ( true ) 或 JOIN ( false )。
有关子查询与 JOIN 的更多信息:https://www.essentialsql.com/what-is-the-difference-between-a-join-and-subquery/#:~:text=Joins%20versus%20Subqueries,tables%20into%20a%20single%20result.&text=Subqueries%20can%20be%20used%20to,for%20use%20in%20a%20query
回到 Sequelize ,subQuery: true(默认)
这将生成如下 SQL

SELECT ...
FROM (SELECT ...(attributes except creationDate) FROM `Items` ...)
LEFT OUTER JOIN `Artists` ...
...
ORDER BY `Items`.`creationDate` DESC
LIMIT 10;
此 SQL 不起作用,因为首先执行嵌套子查询并且子查询不包括 creationDate,并且当执行带有 ORDER 的主 SQL 时, creationDate 不存在。
然后,如果您关闭子查询。 subQuery: false这将生成如下 SQL
SELECT ... (Artist's, Album's attributes and Item's attributes except creationDate) 
FROM `Items`
LEFT OUTER JOIN `Artists` ...
...
ORDER BY `Items`.`creationDate` DESC
LIMIT 10;
这将起作用,因为在执行 ORDER 并且 exclude 发生在顶层时,这不会过滤属性。

关于node.js - Sequelize - 排序和排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63440277/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com