Как сначала установить ограничение, чем создавать запрос where?

#node.js #sequelize.js

#node.js #sequelize.js

Вопрос:

Я создаю некоторый проект, в котором я должен выполнить поиск.

я пытался использовать запрос limit и where вместе, но приоритет запроса where выше limit, поэтому сначала он выполнит запрос where, а не set limit, но я хочу сначала установить limit. пусть limit = 4 итак, сначала я хочу взять 4 записи из sql, а после этого применить запрос where

 router.post("/****", async function(req, res, err) {
  let limit = 4;
  let searchKeyword = req.body.value;
  let offset = 0;
  let page = (req.body.page amp;amp; req.body.page) || 1;
  let sortField = req.body.sortField;
  let sortOrder = req.body.sortOrder;
  if (searchKeyword) {
    var searchKey = searchKeyword;
  } else {
    var searchKey = "";
  }
  tblAdmin
    .findAndCountAll()
    .then(data => {
      let pages = Math.ceil(data.count / limit);
      offset = limit * (page - 1);
      tblAdmin
        .findAll({
          attributes: ["id", "firstName", "lastName", "status", "email"],
          limit: limit,
          offset: offset,
          order: [sortfield || "createdAt", sortOrder || "DESC],
          where: {
               firstName: { [Op.like]: "%"   searchKey   "%" } 
          }
        })
        .then(users => {
          res.status(200).json({
            status: 1,
            message: "Data has been retrieved",
            result: users,
            count: data.count,
            pages: pages
          });
        });
    })
    .catch(err => {
      res.status(500).json({
        status: 0,
        message: "Data is not retrieved from database"
      });
    });
});
  

Если я применю вышеуказанную логику, она вернет первые четыре данные из sql data, которые соответствуют условию where, но я ожидаю, что она вернет результат условия where только для первых четырех, а не для пятого

Комментарии:

1. что вы подразумеваете под пятым ?

2. Вам нужно выполнить вложенный запрос в вашем FROM , поэтому я не думаю, что вы сможете сделать это с sequelize, если вы не согласны использовать необработанные запросы .

Ответ №1:

Сохраняйте тот же порядок для findAndCountAll функции. Первая функция возвращает результат в другом порядке, вторая возвращает в другом.

Ожидание начала .then использования.

 router.post("/****", async function (req, res, err) {
    let limit = 4;
    let searchKeyword = req.body.value;
    let offset = 0;
    let page = (req.body.page amp;amp; req.body.page) || 1;
    let sortField = req.body.sortField;
    let sortOrder = req.body.sortOrder;
    if (searchKeyword) {
        var searchKey = searchKeyword;
    } else {
        var searchKey = "";
    }
    const order = [sortfield || "createdAt", sortOrder || "DESC"];
    offset = limit * (page - 1);
    try {
        let [data, users] = await Promise.all[
            tblAdmin.findAndCountAll({
                order
            }),
            tblAdmin.findAll({
                attributes: ["id", "firstName", "lastName", "status", "email"],
                limit: limit,
                offset: offset,
                order,
                where: {
                    firstName: {
                        [Op.like]: "%"   searchKey   "%"
                    }
                }
            })
        ];
        let pages = Math.ceil(data.count / limit);
        res.status(200).json({
            status: 1,
            message: "Data has been retrieved",
            result: users,
            count: data.count,
            pages: pages
        });
    } catch (error) {
        res.status(500).json({
            status: 0,
            message: "Data is not retrieved from database"
        });
    }
});