'Sequelize: order before applying imit

My query is sorting the array after the limit has been set, so the array is not sorted properly thus returning wrong data. I want to sort the array by associated object's date attribute, and after that, limit the array and use the offset.

await dbBooking.findAll({
                include: [
                    {
                        model: dbEvent,
                        attributes: defaultEventsAttributes,
                        include: [
                            {
                                model: dbUser,
                                through: { attributes: [] },
                                attributes: defaultUsersAttributes,
                            },
                        ],
                    },
                ],
                order: [['event', 'startTime', 'ASC']],
                offset: offset,
                limit: 6,
                attributes: defaultBookingsAttributes,
            });

The SQL Query without subQuery:false

SELECT `booking`.*,
       `event`.`id`           AS `event.id`,
       `event`.`title`        AS `event.title`,
       `event`.`description`  AS `event.description`,
       `event`.`starttime`    AS `event.startTime`,
       `event`.`endtime`      AS `event.endTime`,
       `event->users`.`id`    AS `event.users.id`,
       `event->users`.`email` AS `event.users.email`
FROM   (SELECT `booking`.`id`,
               `booking`.`totalprice`,
               `booking`.`eventid`
        FROM   `bookings` AS `booking`
        LIMIT  0, 6) AS `booking`
       LEFT OUTER JOIN `events` AS `event`
                    ON `booking`.`eventid` = `event`.`id`
       LEFT OUTER JOIN ( `eventusers` AS `event->users->eventuser`
                         INNER JOIN `users` AS `event->users`
                                 ON `event->users`.`id` =
                                    `event->users->eventuser`.`userid`)
                    ON `event`.`id` = `event->users->eventuser`.`eventid`
ORDER  BY `event`.`starttime` ASC; 

subQuery: false

SELECT `booking`.`id`,
       `booking`.`totalprice`,
       `event`.`id`           AS `event.id`,
       `event`.`title`        AS `event.title`,
       `event`.`description`  AS `event.description`,
       `event`.`starttime`    AS `event.startTime`,
       `event`.`endtime`      AS `event.endTime`,
       `event->users`.`id`    AS `event.users.id`,
       `event->users`.`email` AS `event.users.email`
FROM   `bookings` AS `booking`
       LEFT OUTER JOIN `events` AS `event`
                    ON `booking`.`eventid` = `event`.`id`
       LEFT OUTER JOIN ( `eventusers` AS `event->users->eventuser`
                         INNER JOIN `users` AS `event->users`
                                 ON `event->users`.`id` =
                                    `event->users->eventuser`.`userid`)
                    ON `event`.`id` = `event->users->eventuser`.`eventid`
ORDER  BY `event`.`starttime` ASC
LIMIT  0, 6; 

associations

Booking.belongsTo(User);
Booking.belongsTo(Event);
User.belongsToMany(Event, {
    through: { model: EventUsers, unique: false },
    foreignKey: 'userId',
});
Event.belongsToMany(User, {
    through: { model: EventUsers, unique: false },
    foreignKey: 'eventId',
});


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source