簡體   English   中英

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

[英]How to get max values of table with sequelize model.findAll()

我有一個用例,必須將對 Products 表所做的每個更改存儲為已更改的行版本。 所以我的表由如下行組成:

https://i.stack.imgur.com/zXJ8S.png

因此,當我們使用model.findAll()時,它將返回所有行,包括每行的版本。 這對於歷史視圖來說很好。 這里的問題是,我們如何在不返回以前版本(舊更改)的情況下獲取表中所有最新版本的行? 我有點擔心我們可以使用 sequelize max屬性來實現這一點。 但不確定如何使用它來實現我的用例。 誰能告訴我該怎么做? 謝謝

在去續集之前

go 關於它有幾種方法,盡管子查詢是您可以做到的方法之一。

我已經演示了在 where 子句中添加最大 function 的子查詢。

讓我們首先在簡單的 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)

現在將相同的查詢轉換為續集

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`),
      },
  }
})

這是我認為你可以用來解決這個問題的方法。 我也添加了 where 條件,以防你需要 where 條件。

Product.findAll({
  attributes: [
    "ProductId",
    "Name",
    "Price",
    "Location",
    [sequelize.fn("max", sequelize.col("max",sequelize.col("docVersion"), "latestDocVersion"],
  ],
  where: {
    Location: "USA"
  },
  raw: true
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM