【问题标题】:How to get a distinct value of a row with sequelize?如何通过 sequelize 获得行的不同值?
【发布时间】:2017-05-22 01:00:52
【问题描述】:

我有值的表

id country 
1  india
2  usa
3  india

我需要使用 sequelize.js 从 country 列中找到不同的值

这里是我的示例代码...

Project.findAll({

    attributes: ['country'],
    distinct: true
}).then(function(country) {
     ...............
});

有什么方法可以找到不同的值

【问题讨论】:

    标签: node.js express sequelize.js


    【解决方案1】:

    试试这个:https://github.com/sequelize/sequelize/issues/2996#issuecomment-141424712

    Project.aggregate('country', 'DISTINCT', { plain: false })
    .then(...)
    

    【讨论】:

    • 如何为“DISTINCT”列名取别名?它返回一个列名为'DISTINCT'的表
    • 你如何确保它既独特又最新(通过 createdAt)
    【解决方案2】:

    您可以使用 Sequelize.fn 为一个或多个属性指定 distinct

    Project.findAll({
        attributes: [
            // specify an array where the first element is the SQL function and the second is the alias
            [Sequelize.fn('DISTINCT', Sequelize.col('country')) ,'country'],
    
            // specify any additional columns, e.g. country_code
            // 'country_code'
    
        ]
    }).then(function(country) {  })
    

    【讨论】:

    • SequelizeDatabaseError: "DISTINCT" 或附近的语法错误
    • @MuhammadUmer:你找到正确的语法了吗?
    • 我最终写了sql查询,这更容易,而且在js中也做了手工工作
    • 使用 MySQL,此解决方案有效 - 确保使用 DISTINCT 字段作为第一个属性。
    • @Endel 怎么样?因为 sequelize 总是覆盖不同列的位置
    【解决方案3】:

    我最终使用了这样的分组:

    Project.findAll({
      attributes: ['country'],
      group: ['country']
    }).then(projects => 
      projects.map(project => project.country)
    );
    

    它会产生不同的模型,您可以很好地迭代。

    上一个答案中的链接有点帮助:https://github.com/sequelize/sequelize/issues/2996#issuecomment-141424712

    这也很有效,但会生成以 DISTINCT 作为列名的响应:

    Project.aggregate('country', 'DISTINCT', { plain: false })
      .then(...)
    

    【讨论】:

      【解决方案4】:

      您可以使用group 选项,但是为了避免MySQL 错误incompatible with sql_mode=only_full_group_by,您必须将MAX 函数应用于其他属性。

      const countries = await Project.findAll({
        attributes: [
          [Sequelize.fn("MAX", Sequelize.col("id")), "id"],
          "country",
        ],
        group: ["country"],
      });
      

      应该会生成如下的 sql 查询:

      SELECT MAX(`id`) AS `id`, `country` FROM `project` GROUP BY `country`;
      

      【讨论】:

        【解决方案5】:

        您可以使用原始查询来获取结果或sequelize.fn()

        Here’s the documentation on Sequelize raw queries.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-04
          • 2021-01-24
          • 2013-11-26
          • 2021-04-16
          • 1970-01-01
          • 2019-08-19
          • 1970-01-01
          相关资源
          最近更新 更多