按汇总列类型排序

时间:2020-09-05 09:18:42

标签: typescript postgresql nestjs typeorm

我有两个表:user和具有activity关系的@OneToMany

我必须编写一个查询,该查询将为用户计算活动并以可用排序将其返回。我不知道如何排序,因此,我必须在所有字段(包括activityCount)上启用排序。

我试图用loadRelationCountAndMap这样的东西

async getUsersAndCount(
    skip: number,
    limit: number,
    orderBy: string,
    orderOptions: OrderByOptions,
    query?: [string, ObjectLiteral][]
): Promise<[User[], number]> {
    const initialQuery =  this.createInitialQuery();

    if (query && query.length > 0) {
        query.forEach(q => initialQuery.andWhere(q[0], q[1]));
    }

    return await initialQuery.orderBy(orderBy, orderOptions)
        .offset(skip)
        .limit(limit)
        .printSql()
        .getManyAndCount();
}

private createInitialQuery(): SelectQueryBuilder<User> {
    return this.createQueryBuilder('user')
        .loadRelationCountAndMap('activityCount', 'user.activity', 'activityCount')
        .where('user.status = 1')
        .addGroupBy('user.id');

但是我无法通过activityCount字段进行订购。

然后,我尝试使用subQuery,但是它无法创建将通过userId连接到活动表的查询。

然后我尝试使用像这样的普通SQL查询:

await this.query(
        'SELECT u."id"                AS "user_id",\n' +
        '       u."telegram_id"       AS "user_telegram_id",\n' +
        '       u."telegram_username" AS "user_telegram_username",\n' +
        '       COUNT(a.id)           AS activityCount\n' +
        'FROM "user" u\n' +
        'INNER JOIN activity a ON a."userId" = u.id\n' +
        'WHERE u."status" = 1\n' +
        'GROUP BY u."id"\n' +
        `ORDER BY $1 $2\n` +
        `OFFSET $3\n` +
        `LIMIT $4`);

具有参数排序依据,方向,限制和偏移量的参数,但是typeorm没有填充这些参数,我得到了syntax error near $2

我可以连接字符串以填充参数,但这是很糟糕的方法。

我也可以使用VIEW解决此问题,但是也许还有另一种方法?

0 个答案:

没有答案