我需要为表中每个明确命名的项目获取最低值。例如,对于以下表格:
books
id| name
1 | math
2 | chem
3 | chem
4 | chem
5 | math
listings
id|bookID|price
1 | 1 | 4.35
2 | 2 | 2.54
3 | 3 | 1.57
4 | 4 | 4.91
5 | 5 | 7.22
我的查询结果应该返回:
name | price
math | 4.35
chem | 1.57
对此的 SQL 查询将是
SELECT b.name, MIN(l.price)
FROM Book b, Listing l
WHERE b.id = l.bookId
GROUP BY b.name;
我在尝试创建一个执行相同操作的 sequelize 查询时遇到问题......到目前为止我已经得到了这个:
models.Listing.aggregate('book.name', 'models.Listing.min(price)', {
distinct: true,
include: [
{ model: models.Book, as: 'book' }
]
}
最佳答案
使用 Sequelize 函数 ( attributes:
) 直接在 sequelize.fn()
字段中处理聚合函数。
models.Book.findAll({
attributes: ['name'],
include: [ {
model: models.Listing,
attributes: [[sequelize.fn('MIN', sequelize.col('price'), 'min_price']]
} ]
})
.then(function (results) {
return results.map(function (book) {
return {
name: book.name,
price: book.listing.get('min_price')
};
});
});
使用
sequelize.col
而不是字段名称字符串可确保 Sequelize 知道您指的是列,而不是传入的值。此外,如果您想从模型中使用它,则必须添加别名
min_price
。 (即 listing_inst.get('min_price')
)。这是文档的链接:http://sequelize.readthedocs.org/en/latest/docs/querying/#attributes
不幸的是,您真的不能在没有原始查询的情况下直接(未嵌套)返回具有两个表中字段的对象。但是,您可以在
then()
中将它们压缩在一起
关于sql - Group by/Distinct Sequelize 查询功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35878216/