我有以下 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";
关于如何将此请求转换为有效的续集语法有什么建议吗?
好的,我找到了解决方案:
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;