如何通过 sequelize 获得行的不同值?
Posted
技术标签:
【中文标题】如何通过 sequelize 获得行的不同值?【英文标题】:How to get a distinct value of a row with 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)
...............
);
有什么方法可以找到不同的值
【问题讨论】:
【参考方案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.
【讨论】:
以上是关于如何通过 sequelize 获得行的不同值?的主要内容,如果未能解决你的问题,请参考以下文章
sequelize(和 sequelize-cli)queryInterface.createTable 在 PostgreSQL 上,PK id 类型为 UUID 和 defaultValue:Se