Sequelize选择不同的行

时间:2012-08-28 09:18:04

标签: node.js sequelize.js

有没有办法使用sequelize.js从表中选择不同的行? 我仔细查看了文档,但“finder方法”没有指定完成此任务的方法。

7 个答案:

答案 0 :(得分:13)

假设您要将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

答案 1 :(得分:6)

编辑你的“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

希望它有所帮助-_ ^

答案 2 :(得分:3)

您可以执行以下操作:

myModel.findAll({
  attributes: [[sequelize.fn('DISTINCT', sequelize.col('col_name')), 'alias_name']],
  where:{}
}).then(data => {}).....

取自issues并且有效。

答案 3 :(得分:2)

Model.findAll({Attributes: ['col_name1', 'col_name2'], group: ['col_name1', 'col_name2']});

它与Sequelize 5.21完美配合

答案 4 :(得分:1)

这不可能自动生成,但如果您不介意自己创建sql,可以这样做:

sequelize.query('sql goes here', null, { raw: plain }).success(function(data){
    console.log(data)
})

玩得开心:)

<强>更新

  1. Sequelize现在使用then代替success作为承诺函数。
  2. Sequelize.query已被重构为仅使用参数sqloptions
  3. raw接受true/false但不接受plain作为值。
  4. 因此,根据新版本,代码应该如下所示:

        sequelize.query('sql goes here', { raw: true }).then(function(data){
            console.log(data);
        });
    

答案 5 :(得分:1)

这有点类似于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, ... ]
    })
;

答案 6 :(得分:0)

从Sequelize 1.7版开始,select查询已移至lib / dialects / abstract / query-generator.js。

第1167行,更改

  

mainQueryItems.push(&#34; SELECT&#34; + mainAttributes.join ....)

    mainQueryItems.push('SELECT ');
    if (options.distinct) {
        mainQueryItems.push('DISTINCT ');
    }
    mainQueryItems.push(mainAttributes.join(', ') + ' FROM ' + options.table);

顺便说一句,我使用的是Sqlite和Postgres,它们都支持&#34; DISTINCT&#34;。如果您使用的语言不支持不同,那么这条线显然会给您带来麻烦,因为它会为您正在使用的所有SQL风格生成。我怀疑这就是为什么这个简单的改变没有进入主要的Sequelize源代码树。