【问题标题】:Sequelize: Selecting distinct field values from multiple columnsSequelize:从多列中选择不同的字段值
【发布时间】:2020-09-15 12:10:21
【问题描述】:

我正在使用 sequelize 和 mysql2,需要从多个列中选择所有不同的值。 例如,我有一个“标题”和一个“位置”列。

目前:

Job.findAll({
    attributes: [
        [Sequelize.fn('DISTINCT', Sequelize.col('title')), 'title']
    ]
})

works,返回所有不同的职位。但是,如果我为位置列添加第二行,则会出现语法错误

Job.findAll({
    attributes: [
        [Sequelize.fn('DISTINCT', Sequelize.col('title')), 'title'],
        [Sequelize.fn('DISTINCT', Sequelize.col('location')), 'location']
    ]
})

至少从我在文档中读到的内容来看,感觉它应该可以工作 - 但我对 sequelize 并不完全有经验或信心,所以任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: javascript mysql sequelize.js


    【解决方案1】:

    我还没有找到一种不那么麻烦的方法,但是您可以利用 DISTINCT 不是真正的函数,而是一个语句并且始终对整个选定列集进行操作的事实:

    Job.findAll({
        attributes: [
            [Sequelize.fn('DISTINCT', Sequelize.col('title')), 'title'],
            'location'
        ]
    })
    

    会生成类似于

    的SQL
    SELECT DISTINCT(`title`) AS `title`, `location` FROM `Jobs`;
    

    但由于 DISTINCT 不是函数,所以这实际上是一样的

    SELECT DISTINCT (`title`) AS `title`, `location` FROM `Jobs`;
    

    它会做你想做的事,因为列名周围的括号是可选的,那里的查询将与

    SELECT DISTINCT `title`, `location` FROM `Jobs`;
    

    来源:https://dzone.com/articles/sql-distinct-is-not-a-function(这篇文章还谈到了 DISTINCT ON PostgreSQL 扩展,如果有人碰巧也需要它的话)

    请注意,如果 Sequelize 决定在生成 SQL 时更改函数的应用方式,这感觉非常hacky和有点脆弱,并且可能/可能会破坏,但它在我使用的 Sequelize 版本 (5.22.3) 中有效.

    【讨论】:

    • 感谢您的想法,但事实证明 - 至少对于我想做的事情,我已经把事情复杂化了:以下似乎返回了两者的不同列表:Job.findAll({attributes: ['title', 'location'], group: ['title', 'location']})。不过干杯!
    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    相关资源
    最近更新 更多