Sequelize:选择具有给定数量匹配子项的模型

时间:2016-03-11 02:53:05

标签: mysql sequelize.js

在我的架构中,User有多个GameSessionGameSession有多个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,因为我并不总是确定何时使用复数以及何时使用单数,我得到类似的错误

我做错了什么?我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

我认为因为MySQL区分大小写,Games.idGames.IdGames.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?

     

目前没有。我认为有一个功能请求打开   对于它(虽然我无法通过粗略搜索找到它。但事实并非如此   由于需要在子查询上进行连接,因此无法实现。