I have this SQL query:
x
SELECT *
FROM chats
JOIN (SELECT *
FROM messages
WHERE messages.id
IN (SELECT MAX(messages.id)
FROM messages
GROUP BY messages.chatId))
AS lastMessage
ON chats.id = lastMessage.chatId
WHERE chatGroupId = 1
ORDER BY lastMessage.createdAt DESC
It returns the last message in the given chat.
But I don’t understand at all how to execute this moment IN (SELECT MAX(messages.id) FROM messages GROUP BY messages.chatId)) AS lastMessage ON chats.id = lastMessage.chatId
in Sequelize…
Advertisement
Answer
You can use Sequelize.literal
like this:
const message = await Chats.findAll({
where: {
chatGroupId: 1
},
include: [{
model: Messages,
required: true,
where: Sequelize.where(
Seqeulize.col('messages.id'),
Op.in,
Sequelize.literal('(SELECT MAX(m2.id) FROM messages as m2 WHERE m2.chatId = chat.id)')
)
}]
})