Group by / Distinct Sequelize查询函数

时间:2016-03-08 21:19:17

标签: sql postgresql distinct sequelize.js

我需要为表中每个明确命名的项获取最低值。例如,对于以下表格:

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' }
  ]
}

1 个答案:

答案 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()

中将它们挤在一起