【问题标题】:Group by / Distinct Sequelize query with functionsGroup by / Distinct Sequelize 带有函数的查询
【发布时间】:2016-03-08 21:19:16
【问题描述】:

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

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

【问题讨论】:

  • 当你这样做时会发生什么?
  • 这会导致 404,但实际上只是放在一起......我对如何在 sequelized 中构造查询还没有很好的理解。

标签: sql postgresql distinct sequelize.js


【解决方案1】:

使用 Sequelize Functions (sequelize.fn()) 直接在 attributes: 字段中处理聚合函数。

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() 中将它们挤在一起

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-21
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多