我有一个Sequelize查询,我的目标是拥有所有数据项目,但只有那些项目状态与当前状态ID匹配的项目,后者嵌套在另一个模型CodePhaseType中.

以下是目前的关系:

db.project.hasMany(
  db.projectStatus,
  { foreignKey: 'project_id' }
);
db.project.hasMany(
  db.projectStatus,
  { foreignKey: 'project_status_id',sourceKey: "current_project_status_id",
  as: 'currentId' } 
);


db.projectStatus.belongsTo(
  db.codePhaseType,
  { foreignKey: 'code_phase_type_id' }
);
db.codePhaseType.belongsTo(
  db.codeStatusType,
  { foreignKey: 'code_status_type_id' }
);
db.codePhaseType.belongsTo(
  db.codeProjectType,
  { foreignKey: 'code_project_type_id' }
);

这是我try 的查询:

Project.findAll({
      where: where,
      limit,
      offset,
      separate: true,
      attributes: [
        "project_id",
        "project_name",
        "description",
        "onbase_project_number",
        "created_date",
        'code_project_type_id',
        'current_project_status_id',
      ],
      include: [
        {
          model: ProjectStatus,
          as: 'currentId',
          include: {
            model: CodePhaseType,
            where: { code_status_type_id: +filter },
          }
        }
      ]
      ,
      order: [['created_date', 'DESC']]
    })

通过这个查询,我获得了所有匹配其中包含CodePhaseType的WHERE条件的项目. 尽管如此,问题在于分页. 偏移值的计算方法如下所示: 常量偏移量=(第-1页)*限制;

假设我查询第一页,限制为100.我有38个项目. 所以,如果我得到第4页,限制5,我应该得到项目,但它是空的.

生成的查询如下:

SELECT 
  [project].*,
  ...
  [project].[code_project_type_id],
  [project].[current_project_status_id]
  FROM (
    SELECT TOP 15 * FROM (
      SELECT ROW_NUMBER() OVER (
        ORDER BY [project].[created_date] DESC
      ) as row_num, *
      FROM [project] AS [project]) AS [project]
      WHERE row_num > 45
  ) AS [project]
  WHERE (
    SELECT TOP 1 [currentId].[project_status_id]
    FROM [project_status] AS [currentId]
    INNER JOIN [code_phase_type] AS [code_phase_type] ON [currentId].[code_phase_type_id] = [code_phase_type].[code_phase_type_id] AND [code_phase_type].[code_status_type_id] = 1
    WHERE (
      [currentId].[project_status_id] = [project].[current_project_status_id]
    ) 
  ) IS NOT NULL
  ORDER BY [project].[created_date] DESC
  ) AS [project]
  LEFT OUTER JOIN [project_cost] AS [project_costs] ON [project].[project_id] = [project_costs].[project_id]
  LEFT OUTER JOIN ( [project_status] AS [currentId]
  INNER JOIN [code_phase_type] AS [currentId->code_phase_type] ON [currentId].[code_phase_type_id] = [currentId->code_phase_type].[code_phase_type_id]
  AND [currentId->code_phase_type].[code_status_type_id] = 1 ) ON [project].[current_project_status_id] = [currentId].[project_status_id]
  ORDER BY [project].[created_date] DESC;

因此,分页段似乎在条件之前,所以它不能很好地工作.

我用的是5.21.7的Sequelize版本.

推荐答案

我看到你在这个issue中提到的关于极限和补偿问题的问题.

基本上,这是因为WHERE子句上的条件句在偏移期间没有使用.

这个问题现在似乎通过使用subQuery: false解决了,但不幸的是,它只在版本6中可用.

在版本6上生成的查询将如下所示:


SELECT
    TOP 100 PERCENT [project].[project_id],
    ...
    [project].[code_project_type_id],
    [project].[current_project_status_id],
FROM
    (
        SELECT
            TOP 5 *
        FROM
            (
                SELECT
                    ROW_NUMBER() OVER (
                        ORDER BY
                            [project].[created_date] DESC
                    ) as row_num,
                    [project].*
                FROM
                    (
                        SELECT
                            DISTINCT [project].*
                        FROM
                            [project] AS [project]
                            LEFT OUTER JOIN [project_cost] AS [project_costs] ON [project].[project_id] = [project_costs].[project_id]
                            INNER JOIN [project_status] AS [currentId] ON [project].[current_project_status_id] = [currentId].[project_status_id]
                            INNER JOIN [code_phase_type] AS [currentId->code_phase_type] ON [currentId].[code_phase_type_id] = [currentId->code_phase_type].[code_phase_type_id]
                            AND [currentId->code_phase_type].[code_status_type_id] = 1
                    ) AS [project]
            ) AS [project]
        WHERE
            row_num > 35
    ) AS [project]
    LEFT OUTER JOIN [project_cost] AS [project_costs] ON [project].[project_id] = [project_costs].[project_id]
    INNER JOIN [project_status] AS [currentId] ON [project].[current_project_status_id] = [currentId].[project_status_id]
    INNER JOIN [code_phase_type] AS [currentId->code_phase_type] ON [currentId].[code_phase_type_id] = [currentId->code_phase_type].[code_phase_type_id]
    AND [currentId->code_phase_type].[code_status_type_id] = 1
ORDER BY
    [project].[created_date] DESC

如您所见,条件WHERE在Count子查询和项目查询中都使用.

Node.js相关问答推荐

如何从puppeteer的page. evaluate()中获取流数据?(node.js)

当FastifyJS向客户端发送响应时,apache 不会将其发送给他

(0,core_1.default)不是使用@middy/core的lambda处理程序上的函数

Mongoose抱怨说,整数是数字,而不是整数

Node.js分页返回空数组

无法从MongoDB文档中保存的对象数组中获取对象的属性

构建期间 Docker 容器中的 npm 安装失败

GitLab 依赖扫描需要源代码中的 package-lock.json 才能执行

Gulp 能否向 Docker 发出增量构建的第一次迭代完成的信号?

MongoDB - mongoose :如何查询这个? 填充()不起作用.它显示空

npm install 在 Mac 上的 Node-gyp 构建错误

ESLint:TypeError:this.libOptions.parse 不是函数

从数据库读取数据并将其作为可下载的 zip 文件发送

获取数组的至少一个元素包含子字符串的文档

如何刷新 youtube-data-api v3 的访问令牌

如何更改NodeJS中的堆栈大小限制?

在 Jade 包含中使用变量

Selenium WebDriver 等到元素显示

npm install - javascript堆内存不足

Node.js 中的 Streams3 是什么,它与 Streams2 有何不同?