javascript - 如何使用 sequelize model.findAll() 获取表的最大值

标签 javascript mysql node.js postgresql sequelize.js

我有一个用例,必须将对 Products 表所做的每个更改存储为已更改的行版本。所以我的表由如下行组成:
/image/zXJ8S.png
因此,当我们使用 model.findAll() 时,它​​将返回所有行,包括每行的版本。这对于历史 View 来说很好。这里的问题是,我们如何在不返回表的先前版本(旧更改)的情况下获取表中所有最新版本的行?我有点担心我们可以使用 sequelize max 属性来实现这一点。但不确定如何使用它来实现我的用例。任何人都可以请让我知道如何做到这一点?谢谢

最佳答案

在 Sequelize 之前
有几种方法可以解决这个问题,尽管子查询是您可以做到的方法之一。
我已经演示了在 where 子句中添加一个带有 max 函数的子查询。
我们先在简单的mysql中复制一下

mysql> create table product (productId VARCHAR(200), docversion integer, name VARCHAR(200), price integer, location VARCHAR(200));
Query OK, 0 rows affected (1.01 sec)

mysql> insert into product(productID, docversion, name, price, location) VALUES('PID123', 0, 'Chair', 25, 'USA');
Query OK, 1 row affected (0.07 sec)

mysql> insert into product(productID, docversion, name, price, location) VALUES('PID123', 1, 'Chair', 32, 'USA');
Query OK, 1 row affected (0.12 sec)

mysql> insert into product(productID, docversion, name, price, location) VALUES('PID456', 0, 'Table', 39, 'UK');
Query OK, 1 row affected (0.16 sec)

mysql> insert into product(productID, docversion, name, price, location) VALUES('PID456', 1, 'Table', 43, 'Canada');
Query OK, 1 row affected (0.08 sec)

mysql> insert into product(productID, docversion, name, price, location) VALUES('PID123', 2, 'Chair', 29, 'UK');
Query OK, 1 row affected (0.09 sec)

mysql> select * from product;
+-----------+------------+-------+-------+----------+
| productId | docversion | name  | price | location |
+-----------+------------+-------+-------+----------+
| PID123    |          0 | Chair |    25 | USA      |
| PID123    |          1 | Chair |    32 | USA      |
| PID456    |          0 | Table |    39 | UK       |
| PID456    |          1 | Table |    43 | Canada   |
| PID123    |          2 | Chair |    29 | UK       |
+-----------+------------+-------+-------+----------+
5 rows in set (0.00 sec)


mysql> select * from product where  location='USA' AND name='Chair' AND docversion = (select max(docversion) from product where location='USA' AND name='Chair' group by productId);
+-----------+------------+-------+-------+----------+
| productId | docversion | name  | price | location |
+-----------+------------+-------+-------+----------+
| PID123    |          1 | Chair |    32 | USA      |
+-----------+------------+-------+-------+----------+
1 row in set (0.01 sec)
现在将相同的查询转换为 sequelize
product.findAll({
  where: {
      location:{
          [Op.eq]: 'USA',
      },
      name:{
          [Op.eq]: 'Chair',
      },
      docversion:{
          [Op.eq]: sequelize.literal(`select max(docversion) from product where location='USA' AND name='Chair' group by productId`),
      },
  }
})

关于javascript - 如何使用 sequelize model.findAll() 获取表的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66828945/

相关文章:

Javascript onclientclick 有帮助吗?

mysql - 使用 JSTL (JSP) 进行登录验证但出现错误 : "Unterminated <sql:setDataSource tag"

node.js - 替换 PHP,并异步连接到它

node.js - 基本问题生产中的第一个 Node+express+Angular 应用程序

JavaScript 一键禁用两个输入

javascript - 与 URL 的两种方式绑定(bind)获取参数和表单值(选项和 slider )

mysql - 将数据从网格表导入到数据库表 Sql Windows

php - 根据单独的表插入 `COUNT(*)`

node.js - 回调在 connect-mongo 中不起作用

Javascript:根据属性计算产品变体的数量