有没有办法使用 sequelize.js 从表中选择不同的行?我查看了文档,但“查找器方法”没有指定完成此任务的方法。
7 回答
假设您要将 DISTINCT 应用于以下查询:
Tuple.findAll({attributes: ['key', 'value']});
那么这是一种(hackish)方式来实现你想要的,而不必自己编写整个查询:
Tuple.findAll({attributes: [[Sequelize.literal('DISTINCT `key`'), 'key'], 'value']});
(使用 Sequelize v2.1.0 测试)
编辑 2015-06-08:仍然适用于 Sequelize v3.1.1
您可以执行以下操作:
myModel.findAll({
attributes: [[sequelize.fn('DISTINCT', sequelize.col('col_name')), 'alias_name']],
where:{}
}).then(data => {}).....
从问题中提取并且它有效。
编辑你的“node_modules/sequelize/lib/dialects/mysql/query-generator.js”
在 118 号线附近
改变
var query = "SELECT <%= attributes %> FROM <%= table %>"
进入
var query = "SELECT " + ((options.distinct)? 'DISTINCT ':'') +"<%= attributes %> FROM <%= table %>",
现在您可以distinct: true
在续集请求中添加一个选项
希望对你有帮助-_^
这是不可能的,但如果你不介意自己创建 sql,你可以这样做:
sequelize.query('sql goes here', null, { raw: plain }).success(function(data){
console.log(data)
})
玩得开心 :)
更新
- Sequelize 现在使用
then
而不是success
作为 promise 函数。 Sequelize.query
已被重构为仅使用参数sql
和options
raw
接受true/false
但不plain
作为价值。
所以,根据新版本,代码应该是这样的:
sequelize.query('sql goes here', { raw: true }).then(function(data){
console.log(data);
});
Model.findAll({Attributes: ['col_name1', 'col_name2'], group: ['col_name1', 'col_name2']});
Sequelize 5.21 完全没问题
这有点类似于 Pascal Ludwig 提出的解决方案,但对于那些登陆这里希望获取给定列的不同值列表的人,您可以执行以下操作:
MyModel.aggregate('teh_field', 'DISTINCT', { plain: false }).then(...)
// Resolves to: [ { DISTINCT: value1 }, { DISTINCT: value2 }, ... ]
这样,很容易将其转换为标准列表:
MyModel.aggregate('teh_field', 'DISTINCT', { plain: false })
.map(function (row) { return row.DISTINCT })
.then(function (tehValueList) {
// tehValueList = [ value1, value2, ... ]
})
;
从 Sequelize 1.7 版开始,选择查询已移至 lib/dialects/abstract/query-generator.js。
在 1167 行附近,更改
mainQueryItems.push("SELECT "+mainAttributes.join ....)
到
mainQueryItems.push('SELECT '); if (options.distinct) { mainQueryItems.push('DISTINCT '); } mainQueryItems.push(mainAttributes.join(', ') + ' FROM ' + options.table);
顺便说一句,我使用 Sqlite 和 Postgres,它们都支持“DISTINCT”。如果您使用的方言不支持 distinct,那么显然这条线会给您带来问题,因为它将为您使用的所有 SQL 风格生成。我怀疑这就是为什么这个简单的更改没有进入主 Sequelize 源代码树的原因。