반응형
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
반응형
'programing' 카테고리의 다른 글
SELECT MAX('Id')를 테이블에서 setval()로 전달합니다. (0) | 2022.09.13 |
---|---|
Python에서 싱글톤 만들기 (0) | 2022.09.13 |
PHP 치명적 오류: 클래스를 다시 닫을 수 없습니다. (0) | 2022.09.13 |
"SET NAMS" 사용 여부 (0) | 2022.09.12 |
pecl 확장을 설치하려고 하면 Mac os x 10.7.3에서 $PHP_AUTOCONF 오류가 발생함 (0) | 2022.09.12 |