在我的架构中,User
有多个GameSession
,GameSession
有多个Game
。
对于特定用户,我尝试选择最近有三个游戏的游戏会话,每个游戏都有一个非空分数。
This comment看起来几乎完全符合我的要求,但它并不适合我。它建议使用此代码:
ModelA.findAll({
include: [ModelB],
having: 'count(ModelB.id) > 0'
});
我认为上述评论可能已过时,因为除非我将having
子句包装在数组中,否则我会Error: where: "raw query" has been removed, please use where ["raw query", [replacements]]
。
所以我有这个JS:
user.getGameSessions({
include: [
{
model: models.Game,
where: {
score: {
$ne: null
}
}
}
],
having: ['count(Games.id) = 3'],
order: [['updatedAt', 'DESC']],
limit: 1
}).then(function(gameSessions) {
res.json(gameSessions);
});
这是它正在进行的查询:
SELECT
`GameSession`.*,
`Games`.`id` AS `Games.id`,
...
FROM (
SELECT
`GameSession`.`id`,
...
`GameSession`.`UserId`
FROM `GameSessions` AS `GameSession`
WHERE `GameSession`.`UserId` = 33 AND (
SELECT `GameSessionId`
FROM `Games` AS `Game`
WHERE (
`Game`.`GameSessionId` = `GameSession`.`id`
AND `Game`.`score` IS NOT NULL
)
LIMIT 1
) IS NOT NULL
HAVING count(Games.id) = 3
ORDER BY `GameSession`.`updatedAt` DESC
LIMIT 1
) AS `GameSession`
INNER JOIN `Games` AS `Games`
ON `GameSession`.`id` = `Games`.`GameSessionId`
AND `Games`.`score` IS NOT NULL
ORDER BY `GameSession`.`updatedAt` DESC;
但是运行此命令会出现以下错误:SequelizeDatabaseError: ER_BAD_FIELD_ERROR: Unknown column 'Games.id' in 'having clause'
。我也尝试在Game.id
子句中使用单数having
,因为我并不总是确定何时使用复数以及何时使用单数,我得到类似的错误
我做错了什么?我怎样才能做到这一点?
答案 0 :(得分:0)
我认为因为MySQL区分大小写,Games.id
为Games.Id
或Games.ID
。
如果我是你在将来为自己保留一些悲伤,只需将每个表格和列放在大写或全部小写。不要做骆驼套管或类似的东西!它变得非常难以调试。
所以你的代码可能是:
having: 'count(Games.id) = 3',
应该是:
having: 'count(Games.Id) = 3',
编辑:
你有没有试过在你的计数周围加上反击?像这样:
having: 'count(`Games`.`id`) = 3',
答案 1 :(得分:0)
Is it possible to limit an include?
目前没有。我认为有一个功能请求打开 对于它(虽然我无法通过粗略搜索找到它。但事实并非如此 由于需要在子查询上进行连接,因此无法实现。