sequelize - 使用 MAX()、INNER JOIN 和 GROUP BY 翻译 SQL 代码以进行sequelize

问题描述 投票:0回答:1

我有以下 SQL 请求,我希望将其包含在续集语法中:

SELECT discussions.id, discussions.name, discussions.open, MAX(messages.date) AS last_message_date
FROM discussions
INNER JOIN messages ON discussions.id = messages.discussion_id
WHERE forum_id= 2
GROUP BY discussions.id
ORDER BY last_message_date DESC
LIMIT 20
OFFSET 0

我目前有以下代码,但它不起作用:

const discussions = await dbUtil.Discussion.findAll({
  attributes: ['id', 'name', 'open'],
  include: {
    model: dbUtil.Message,
    attributes: [[Sequelize.fn('MAX', Sequelize.col('date')), 'last_message_date']],
    required: true
  },
  where: {
    forum_id: forumId
  },
  group: ['discussions.id'],
  offset,
  limit: PAGE_LIMIT
});

它生成以下 SQL 查询:

SELECT "Discussion".*, "Messages"."id" AS "Messages.id", MAX("date") AS "Messages.last_message_date"
FROM (
  SELECT "Discussion"."id", "Discussion"."name", "Discussion"."open"
  FROM "discussions" AS "Discussion"
  WHERE "Discussion"."forum_id" = 2 AND (
    SELECT "discussion_id"
    FROM "messages" AS "Messages"
    WHERE ("Messages"."discussion_id" = "Discussion"."id")
    LIMIT 1
  ) IS NOT NULL
  GROUP BY "discussions"."id"
  LIMIT 20
  OFFSET 0
) AS "Discussion"
INNER JOIN "messages" AS "Messages" ON "Discussion"."id" = "Messages"."discussion_id";

关于如何将此请求转换为有效的续集语法有什么建议吗?

sql postgresql sequelize.js
1个回答
0
投票

好的,我找到了解决方案:

await dbUtil.Discussion.findAll({
  attributes: ['id', 'name', 'open'],
  include: {
    model: dbUtil.Message,
    attributes: [[Sequelize.fn('MAX', Sequelize.col('date')), 'last_message_date']],
    required: true
  },
  where: {
    forum_id: forumId
  },
  group: ['Discussion.id'],
  order: [[Sequelize.fn('MAX', Sequelize.col('date')), 'DESC']],
  limit: PAGE_LIMIT,
  offset,
  raw: true,
  subQuery: false
});

它生成以下 SQL 查询,该查询与我的原始查询非常接近:

SELECT "Discussion"."id", "Discussion"."name", "Discussion"."open", MAX("date") AS "Messages.last_message_date"
FROM "discussions" AS "Discussion"
INNER JOIN "messages" AS "Messages" ON "Discussion"."id" = "Messages"."discussion_id"
WHERE "Discussion"."forum_id" = 2
GROUP BY "Discussion"."id"
ORDER BY MAX("date") DESC
LIMIT 20
OFFSET 20;
© www.soinside.com 2019 - 2024. All rights reserved.