【发布时间】:2021-01-27 09:34:53
【问题描述】:
我是 MYSQL 的新手。
我需要自定义此查询。现在我只使用了IF条件,查询长度太大了。
在这个存储过程中,我们仅根据 _status 值更改 'f.status' 值
前:
__status = '全部'
ON f.financeId = t.financeId where f.status=0;
__status = '付费'
ON f.financeId = t.financeId where f.status=1;
__status = '未付费'
开启 f.financeId = t.financeId 其中 f.status=2;
查询:
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `all_data_search`(
_status VARCHAR(50)
)
BEGIN
IF (_status='All') THEN
SELECT
f.financeId,
f.customerId,
c.customerName,
c.initial,
c.phone1,
c.aadhaar,
f.financeStartDate,
f.vehicleNumber,
f.loanAmount,
f.totalInstallment,
f.installmentAmount,
COALESCE(t.payedInstallment, 0) as payedInstallment,
f.status,
f.created_by,
f.created_date,
f.updated_by,
f.updated_date
FROM finance f
INNER JOIN customer c
ON c.customerId = f.customerId
LEFT JOIN
(
SELECT financeId, COUNT(status) AS payedInstallment
FROM financeinstallment
WHERE status = 1
GROUP BY financeId
) t
ON f.financeId = t.financeId;
END IF;
IF (_status='0') THEN
SELECT
f.financeId,
f.customerId,
c.customerName,
c.initial,
c.phone1,
c.aadhaar,
f.financeStartDate,
f.vehicleNumber,
f.loanAmount,
f.totalInstallment,
f.installmentAmount,
COALESCE(t.payedInstallment, 0) as payedInstallment,
f.status,
f.created_by,
f.created_date,
f.updated_by,
f.updated_date
FROM finance f
INNER JOIN customer c
ON c.customerId = f.customerId
LEFT JOIN
(
SELECT financeId, COUNT(status) AS payedInstallment
FROM financeinstallment
WHERE status = 1
GROUP BY financeId
) t
ON f.financeId = t.financeId where f.status=0;
END IF;
IF (_status = 'PAID') THEN
SELECT
f.financeId,
f.customerId,
c.customerName,
c.initial,
c.phone1,
c.aadhaar,
f.financeStartDate,
f.vehicleNumber,
f.loanAmount,
f.totalInstallment,
f.installmentAmount,
COALESCE(t.payedInstallment, 0) as payedInstallment,
f.status,
f.created_by,
f.created_date,
f.updated_by,
f.updated_date
FROM finance f
INNER JOIN customer c
ON c.customerId = f.customerId
LEFT JOIN
(
SELECT financeId, COUNT(status) AS payedInstallment
FROM financeinstallment
WHERE status = 1
GROUP BY financeId
) t
ON f.financeId = t.financeId where f.status=1;
END IF;
IF (_status = 'UNPAID') THEN
SELECT
f.financeId,
f.customerId,
c.customerName,
c.initial,
c.phone1,
c.aadhaar,
f.financeStartDate,
f.vehicleNumber,
f.loanAmount,
f.totalInstallment,
f.installmentAmount,
COALESCE(t.payedInstallment, 0) as payedInstallment,
f.status,
f.created_by,
f.created_date,
f.updated_by,
f.updated_date
FROM finance f
INNER JOIN customer c
ON c.customerId = f.customerId
LEFT JOIN
(
SELECT financeId, COUNT(status) AS payedInstallment
FROM financeinstallment
WHERE status = 1
GROUP BY financeId
) t
ON f.financeId = t.financeId where f.status=2;
END IF;
END ;;
DELIMITER ;
【问题讨论】:
-
优化还是简化?
-
简化…………
-
ON f.financeId = t.financeId where f.status=FIND_IN_SET(_status, 'ALL,PAID,UNPAID') - 1;或相同的使用 CASE 函数。
标签: mysql sql stored-procedures