0

这是我关于 stackoverflow 的第一个问题,以前从未使用过,但这个问题让我把头发扯掉了。

我正在为我正在开发的反应应用程序构建一个无限滚动组件,我正在尝试使 Postgres DB 查询工作。

我有 2 张桌子 - 挑战和用户挑战。

挑战有许多用户挑战。

我需要获得挑战的一个小节(从开始到结束),每个挑战都计算“参与者”的数量(相关的用户挑战的数量),以及所有挑战的数量。

像这样的东西:

{
rows: [Challenge, Challenge, Challenge],
count: n
}

每个挑战包括作为“参与者”的用户挑战的总数,并且计数是所有挑战的计数。

这是查询:

let json_query = {
    attributes: { 
        include: [[Sequelize.fn("COUNT", Sequelize.col("user_challenges.id")), "participants"]] 
    },
    include: [{
        model: UserChallenge, attributes: []
    }],
    order: [['timestamp', 'DESC']],
    offset: start, 
    limit: end
  }

开始结束数量是分页的开始和结束。

我正在按如下方式运行此查询:

var challengeInstances = await Challenge.findAndCountAll(json_query)

这会导致以下错误:

name: 'SequelizeDatabaseError',
  
parent: error: missing FROM-clause entry for table "user_challenges"

这是它说它正在运行的sql:

`SELECT "challenge".* FROM (SELECT "challenge"."id", "challenge".*, COUNT("user_challenges"."id"), "challenge"."participants" FROM "challenges" AS "challenge" GROUP BY "challenge"."id" ORDER BY "challenge"."end_date" DESC LIMIT '4' OFFSET '0') AS "challenge" LEFT OUTER JOIN "user_challenges" AS "user_challenges" ON "challenge"."id" = "user_challenges"."challenge_id" ORDER BY "challenge"."end_date" DESC;`,

Sequelize 或原始查询都很好。如果您需要更多信息,请告诉我,非常感谢。

4

1 回答 1

0

您可以像这样使用续集文字并从属性中删除对象,只需将此代码粘贴到属性中即可。

attributes: [
    [
        sequelize.literal(`(
        SELECT COUNT(id)
            FROM user_challenges
        WHERE 
            // your condition of foreign key like (user_challenges.participants_id = participants.id)
    )`),
        'numberOfParticipants'
    ]
]
于 2020-08-28T03:34:30.797 回答