如何在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做对了。