programing

json 개체로 반환할 여러 DB 쿼리가 있습니다. 더 깔끔한 접근 방식?

prostudy 2022. 9. 13. 21:32
반응형

json 개체로 반환할 여러 DB 쿼리가 있습니다. 더 깔끔한 접근 방식?

자, 이게 제가 작업하는 코드입니다좀 더 깔끔한 방법이 없을까 해서요.왜냐하면 암호가 쌓이면 지저분한 코드 블록처럼 보일 테니까요.mariah db + express 입니다.

app.get

("/ordersInfo", function (req, res) {
  connection.query("SELECT SUM(`subtotal`) as data FROM `orders` WHERE created_at BETWEEN '" + moment().startOf("day").format() + "' AND '" + moment().endOf("day").format() + "'", (err, dailyTotalRevenue) => {
    connection.query("SELECT SUM(`subtotal`) as data FROM `orders` WHERE created_at BETWEEN '" + moment().startOf("week").format() + "' AND '" + moment().endOf("week").format() + "'", (err, weeklyTotalRevenue) => {
      connection.query("SELECT SUM(`subtotal`) as data FROM `orders` WHERE created_at BETWEEN '" + moment().startOf("month").format() + "' AND '" + moment().endOf("month").format() + "'", (err, monthlyTotalRevenue) => {
        connection.query("SELECT COUNT(*) as data FROM `orders` WHERE created_at BETWEEN '" + moment().startOf("day").format() + "' AND '" + moment().endOf("day").format() + "'", (err, dailyTotalOrderCount) => {
          connection.query("SELECT COUNT(*) as data FROM `orders` WHERE created_at BETWEEN '" + moment().startOf("week").format() + "' AND '" + moment().endOf("week").format() + "'", (err, weeklyTotalOrderCount) => {
            connection.query("SELECT COUNT(*) as data FROM `orders` WHERE created_at BETWEEN '" + moment().startOf("month").format() + "' AND '" + moment().endOf("month").format() + "'", (err, monthlyTotalOrderCount) => {
              connection.query("SELECT * FROM `orders` WHERE created_at BETWEEN '" + moment().startOf("month").format() + "' AND '" + moment().endOf("month").format() + "'", (err, month) => {
                connection.query("SELECT COUNT(*) as data FROM `orders` WHERE status = 'pending'", (err, totalPending) => {
                  connection.query("SELECT COUNT(*) as data FROM `orders` WHERE status = 'ready_to_ship'", (err, totalReadyToShip) => {
                    if (err) {
                      console.log(err);
                      res.json({ error: true });
                    } else {
                      return res.json({
                        daily: {
                          totalRevenue: (dailyTotalRevenue[0].data) ? dailyTotalRevenue[0].data : 0,
                          totalOrderCount: (dailyTotalOrderCount[0].data) ? dailyTotalOrderCount[0].data : 0,
                        },
                        weekly: {
                          totalRevenue: (weeklyTotalRevenue[0].data) ? weeklyTotalRevenue[0].data : 0,
                          totalOrderCount: (weeklyTotalOrderCount[0].data) ? weeklyTotalOrderCount[0].data : 0,
                        },
                        monthly: {
                          totalRevenue: (monthlyTotalRevenue[0].data) ? monthlyTotalRevenue[0].data : 0,
                          totalOrderCount: (monthlyTotalOrderCount[0].data) ? monthlyTotalOrderCount[0].data : 0,
                        },
                        total: {
                          totalPending: totalPending[0].data,
                          totalReadyToShip: totalReadyToShip[0].data,
                        }
                      });
                    }
                  });
                });
              });
            });
          });
        });
      });
    });
  });
});

결과는 다음과 같습니다.

여기에 이미지 설명 입력

작업은 완료되지만 DB에서 테이블 하나를 검색해야 하는 정보가 더 많이 있습니다.이에 대한 보다 깨끗하고 효율적인 접근법이 있습니까?

개별 쿼리는 다음과 같이 리팩터링할 수 있습니다.

select sum(case when DATE(created_at) = CURDATE() then subtotal end) as dailyTotalRevenue,
       sum(case when YEARWEEK(created_at, 1) = YEARWEEK(CURDATE(), 1) then subtotal end) as weeklyTotalRevenue,
       count(case when status = 'pending' then 1 end) as pendingCount,
       count(case when status = 'ready_to_ship' then 1 end) as readyToShipCount
from orders

다음 표 데이터:

결과(오늘은 2021-02-14) :

상세 정보:Count()에서 조건을 지정할 수 있습니까?

추가 인수는 주의해 주세요.1)는 월요일을 주의 시작일로 지정하기 위해 YEARWEEK로 넘어갔습니다.

약속 체인을 사용하여 더 깔끔하고 읽기 쉽게 쓸 수 있습니다.sudo 코드는 다음과 같습니다.

db를 쿼리하는 일반적인 함수:

function QueryDB(queryString) {
  return new Promise((resolve, reject) => {
    connection.query(queryString, (err, data) => {
      if (err) reject(err.message);
      resolve(data);
    });
  });
}

그런 다음 다음과 같이 체인을 구성할 수 있습니다.

QueryDB(qs1).then(data => QueryDB(qs2)).then(data => QueryDB(qs3))./*more chaining*/.catch(err => console.log(err))

언급URL : https://stackoverflow.com/questions/66195631/multiple-db-queries-to-return-as-json-object-a-cleaner-approach

반응형