我需要为表中每个明确命名的项获取最低值。例如,对于以下表格:
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' }
]
}
答案 0 :(得分:0)
使用Sequelize Functions(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
不幸的是,在没有原始查询的情况下,您实际上只能直接返回一个具有两个表中字段的对象(unnested)。但是,你可以在then()