如何使用sequelizejs对两个联接表的行进行计数

时间:2019-06-18 22:51:57

标签: sequelize.js

我有两个表 user like 。关系是一对多的,用户可以有很多喜欢。我想计算一个用户有多少个喜欢的对象,并返回一个带有用户名的对象,并以一个喜欢的数量返回一个列数,但是,我发现很难进行续集。

以下是有效的原始查询,结果是一个表。

|用户名|计数|

| John Doe | 2 |

SELECT us.username, COUNT(lk.other_user_id)
FROM user as us
INNER JOIN like as lk
ON us.id = lk.other_user_id
WHERE us.id = 40
GROUP BY us.username

这是我尝试过的续集代码。

like.findAll({
        attributes: {
          include: [[sequelize.fn('COUNT', sequelize.col('other_user_id')), 'like_count']],
        },
        where: { other_user_id: 40 },
        include: [{
          model: user,
          attributes: [],
          where: { id: 40 },
        }],

        group: ['user.username'],
      });

结果应为具有用户名称的对象和具有“喜欢”次数的属性 count 。而是返回所有行并为每个对象计为1。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。我包括了 user ,但是在上述有问题的SQL原始查询中,在 join 条件下,我测试了 user.id = like.other_user_id ,但外部 like 表上的键是 user_id ,并指向 user 表上的 id 列,因此无法进行续集找不到具有 user.id = like.other_user_id 的任何行,而是匹配为 user.id = like.user_id 的行。

下面是我的解决方案,其中我加入了自定义列上的表格。

const { ok, result, error } = await handlePromise(like.findAll({
        attributes: [[sequelize.fn('COUNT', sequelize.col('like.other_user_id')), 'like_count']],
        include: [
          {
            model: user,
            where: { id: userId },
            attributes: ['username'],
            on: {
              col1: sequelize.where(sequelize.col('user.id'), '=', sequelize.col('like.other_user_id')),
            },
          },
        ],
        group: ['user.username'],
        raw: true,
      }));