我有一个看起来像这样的实体:
@Entity({ tableName: 'certificates' })
@Unique({ properties: ['version', 'type'] })
export class CertificateEntity extends BaseEntity {
@Property({ type: 'float' })
version: number;
@Property()
name: string;
@Property()
type: CertificateType;
@Property()
description: string;
}
我正在尝试通过
version
获取每个 type
的最新证书列表。因此,只应出现每种类型的最高版本。
我在跑步
const r = await this.em.createQueryBuilder(CertificateEntity)
.select(['type', 'version'])
.groupBy('type')
.execute();
但是我得到的是
{
"statusCode": 500,
"path": "/certificates/list",
"errorType": "error",
"errorMessage": "select \"c0\".\"type\", \"c0\".\"version\" from \"certificates\" as \"c0\" group by \"c0\".\"type\" - column \"c0.version\" must appear in the GROUP BY clause or be used in an aggregate function"
}
如果我按照错误消息的指示添加
version
。我刚拿到清单
[
{
"version": 1.7,
"type": "s-type"
},
{
"version": 1.6,
"type": "s-type"
},
{
"version": 1.5,
"type": "s-type"
}
]
我做错了什么?
错误提示“必须出现在 GROUP BY 子句中或在聚合函数中使用”,对于您想要执行的操作,第二部分有效,而不是第一部分。您希望对要选择的列使用聚合函数,但不按它们分组。这是因为分组可以为版本产生不同的值 - 并且根据您所说的内容,您应该选择
max(version)
而不仅仅是 version
。
试试这个:
const r = await this.em.createQueryBuilder(CertificateEntity)
.select(['type', sql`max(version)`])
.groupBy('type')
.execute();
sql
是从 @mikro-orm/core
或任何其他驱动程序包导出的帮助程序,请参阅 https://mikro-orm.io/docs/raw-queries)