如何在mySQL中避免多个几乎相同的子查询
我需要得到两个几乎相同的子查询的结果,我想知道是否有一种方法可以在不降低执行两次子查询的效率的情况下完成如何在mySQL中避免多个几乎相同的子查询,mysql,sql,Mysql,Sql,我需要得到两个几乎相同的子查询的结果,我想知道是否有一种方法可以在不降低执行两次子查询的效率的情况下完成 SELECT DISTINCT(liens.lienID), ROUND(liens.lienSettlementAmount, 2) as lienSettlementAmount, (SELECT ROUND(SUM(lienBills.amount), 2) FROM lienBills2Lien LEFT JOIN lienBills ON lienBills2Lien.lie
SELECT
DISTINCT(liens.lienID),
ROUND(liens.lienSettlementAmount, 2) as lienSettlementAmount,
(SELECT
ROUND(SUM(lienBills.amount), 2)
FROM lienBills2Lien
LEFT JOIN lienBills ON lienBills2Lien.lienBillID = lienBills.lienBillID
WHERE lienBills2Lien.lienID = liens.lienID
) AS totalBill,
(SELECT
ROUND(SUM(lienBills.amount), 2) - lienSettlementAmount
FROM lienBills2Lien
LEFT JOIN lienBills ON lienBills2Lien.lienBillID = lienBills.lienBillID
WHERE lienBills2Lien.lienID = liens.lienID
) AS savings
FROM events
RIGHT JOIN liens ON events.childID = liens.lienID
WHERE events.fileNumber = 14275
AND events.eventTypeID = 79
唯一的区别是在第二个子查询中减去lienSettlementAmount
这个查询正好提供了我所需要的,但它感觉不太对。看来应该有更好的办法
更新:@StanislavL有正确的答案。以下是确切的代码:
SELECT
DISTINCT(liens.lienID),
ROUND(liens.lienSettlementAmount, 2) as lienSettlementAmount,
sub.r_sum as totalBill,
sub.r_sum - lienSettlementAmount as savings
FROM events
RIGHT JOIN liens ON events.childID = liens.lienID
LEFT JOIN (SELECT lienBills2Lien.lienID,
ROUND(SUM(lienBills.amount), 2) AS r_sum
FROM lienBills2Lien
LEFT JOIN lienBills ON lienBills2Lien.lienBillID = lienBills.lienBillID
GROUP BY lienBills2Lien.lienID
) sub ON sub.lienID = liens.lienID
WHERE events.fileNumber = 14275
AND events.eventTypeID = 79
但是,使用单个子查询的执行时间更高。此查询需要0.0205秒。带有两个子查询的挖掘需要0.0054秒。我没想到会有这样的结果
为什么单个子查询会比较慢?也许这应该是一个单独的问题
SELECT
DISTINCT(liens.lienID),
sub.r_sum as totalBill,
sub.r_sum-lienSettlementAmount as savings,
FROM events
RIGHT JOIN liens ON events.childID = liens.lienID
LEFT JOIN (SELECT lienBills2Lien.lienID
ROUND(SUM(lienBills.amount), 2) as r_sum
FROM lienBills2Lien
LEFT JOIN lienBills ON lienBills2Lien.lienBillID = lienBills.lienBillID
GROUP BY lienBills2Lien.lienID
) sub ON sub.lienID= liens.lienID
只需将子查询移动到FROM并添加JOIN我就可以理解这个查询表单:
SELECT DISTINCT(liens.lienID),
ROUND(liens.lienSettlementAmount, 2) as lienSettlementAmount,
(SELECT
ROUND(SUM(lienBills.amount), 2) AS totalBill,
ROUND(SUM(lienBills.amount), 2) - lienSettlementAmount AS savings
FROM lienBills2Lien LEFT JOIN lienBills ON lienBills2Lien.lienBillID = lienBills.lienBillID
WHERE lienBills2Lien.lienID = liens.lienID)
FROM events RIGHT JOIN liens ON events.childID = liens.lienID WHERE events.fileNumber = 14275 AND events.eventTypeID = 79;
这里只有一个子查询。我很想知道你是否得到了同样的结果
问候不要走。查询从子查询返回多个字段。据我所知,子查询只能返回一个字段。不错的尝试。:)我只是试着运行它,却遇到了同样的问题。很抱歉我希望@StanislavL做对了。