如何在mySQL中避免多个,几乎相同的子查询

时间:2016-03-12 18:58:08

标签: 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.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秒。我没想到这个结果。

为什么单个子查询会变慢?也许这应该是一个单独的问题......

2 个答案:

答案 0 :(得分:2)

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

JUst将子查询移动到FROM并添加JOIN

答案 1 :(得分:0)

我可以找出这个查询表单:

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;

在这里你只有一个子查询。我真的很想知道你是否得到了同样需要的结果。

此致