![](/img/trans.png)
[英]Sequelize getters do not run on model.findall( { raw:true } )
[英]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.