簡體   English   中英

mysql 內部連接表上的左連接

[英]Left join on the inner join table for mysql

我有三個表表 A、表 B 和表 C。我原來的查詢是

SELECT  TableA.ClientID,  TableA.id,  TableA.Milestone, SUM(TableA.totalamount)
FROM  TableA 
WHERE TableA.Milestone IN('Ready to Book') 
AND TableA.MilestoneDate BETWEEN'2020-01-29 00:00:00'  AND '2020-01-29 23:59:59'  
AND TableA.Type IN( 'Purchase','Refinance','Purchase / Refinance','Variation - 
Docs Only','Upstamp','Refinance (unattended)' ) 
GROUP BY TableA.clientID
UNION 
SELECT  TableA.ClientID,  TableA.id,  TableA.Milestone, SUM(TableA.totalamount)
FROM  TableA 
WHERE TableA.Milestone IN('Ready to Book') 
AND TableA.MilestoneDate BETWEEN '2020-01-23 00:00:00'  and '2020-01-28 23:59:59' 
AND TableA.Type IN( 'Purchase','Refinance','Purchase / Refinance','Variation - 
Docs Only','Upstamp','Refinance (unattended)' ) 
GROUP BY TableA.clientID
UNION
SELECT  TableA.ClientID,  TableA.id,  TableA.Milestone, SUM(TableA.totalamount)
FROM  TableA 
WHERE TableA.Milestone IN('Ready to Book') 
AND TableA.MilestoneDate BETWEEN '2019-12-15 00:00:00'   and '2020-01-22 23:59:59' 
AND TableA.Type IN( 'Purchase','Refinance','Purchase / Refinance','Variation - 
Docs Only','Upstamp','Refinance (unattended)' ) 
GROUP BY TableA.clientID
UNION
SELECT  TableA.ClientID,  TableA.id,  TableA.Milestone, SUM(TableA.totalamount)
FROM  TableA 
WHERE TableA.Milestone IN('Ready to Book') 
AND TableA.`MilestoneDate` BETWEEN '2019-12-12 00:00:00'   and '2020-01-14 23:59:59'    
AND TableA.Type IN( 'Purchase','Refinance','Purchase / Refinance','Variation - 
Docs Only','Upstamp','Refinance (unattended)' ) 
GROUP BY TableA.clientID
UNION
SELECT  TableA.ClientID,  TableA.id,  TableA.Milestone, SUM(TableA.totalamount)
FROM  TableA 
WHERE TableA.Milestone IN('Ready to Book') 
AND TableA.MilestoneDate <= '2019-12-14 23:59:59'   
AND TableA.Type IN( 'Purchase','Refinance','Purchase / Refinance','Variation - 
Docs Only','Upstamp','Refinance (unattended)' ) 
GROUP BY TableA.clientID

此查詢正在考慮所有具有“准備預訂”值的里程碑,並且 TotalAmount 是根據不同日期范圍內的 ClientID 和 Union 分組匯總的。

我正在嘗試修改此查詢以考慮“准備預訂”和“已預訂”這兩個里程碑值。 我喜歡有表 A 中“准備預訂”的所有記錄,並且只有表 A 中滿足表(B 和 C)TableB.HexaID <> '' 和 TableC.AcceptedDate IS NULL 的條件的那些記錄.

所以我的查詢應該是

SELECT  TableA.ClientID,  TableA.id,  TableA.Milestone, SUM(TableA.totalamount)
FROM  TableA 
Left JOIN (TableB ON TableA.id = TableB.id
INNER JOIN TableC on TableC.id = tableB.id WHERE TableB.HexaID <> ''And TableC.AcceptedDate IS NULL)
WHERE TableA.Milestone IN('Ready to Book', 'Already Booked') 
AND TableA.MilestoneDate BETWEEN'2020-01-29 00:00:00'  AND '2020-01-29 23:59:59'  
AND TableA.Type IN( 'Purchase','Refinance','Purchase / Refinance','Variation - 
Docs Only','Upstamp','Refinance (unattended)' ) 
GROUP BY TableA.clientID
UNION
SELECT  TableA.ClientID,  TableA.id,  TableA.Milestone, SUM(TableA.totalamount)
FROM  TableA 
Left JOIN TableB ON TableA.id = TableB.id
INNER JOIN (TableC on TableC.id = tableB.id WHERE TableB.HexaID <> ''And TableC.AcceptedDate IS NULL)
WHERE TableA.Milestone IN('Ready to Book', 'Already Booked') 
AND TableA.`MilestoneDate` BETWEEN '2020-01-23 00:00:00'  and '2020-01-28 23:59:59'  
AND TableA.Type IN( 'Purchase','Refinance','Purchase / Refinance','Variation - 
Docs Only','Upstamp','Refinance (unattended)' ) 
GROUP BY TableA.clientID UNION etc

我收到語法錯誤。 這是如何實現的。 請指導

這是您的查詢的修訂版本。 通常,“Group by”子句嘗試按不屬於聚合的所有內容進行分組。 在您的原始查詢中,您對客戶端 ID 進行了分組,但您還返回了“B”表 ID 和里程碑日期(基於日期/時間的日期可能不會重復,因為您在時間戳列測試到分鍾: 第二也是。

因此,我刪除了那些額外的列,因為您主要考慮的是客戶的組。

接下來,暫時忽略我總結的其余列,我添加了更多您可能感興趣的內容,並認為我會預先提供。

現在,JOINing…表 A 到 B 在常見的“id”列上很容易,但在表 B 中你只想要非空的 HexaID 值,所以我也添加了“AND”子句(而不是什么你有第二個 WHERE 子句)。

表 C 的最后一個 JOIN 為 INNER JOIN,但來自表 B 是左連接。 這將導致凈 INNER 連接,因為第三級“C”在內部,因此將強制要求“B”。 為了單獨解決這些問題,我使用了傳遞屬性.. 因為 A.id = B.id 和 B.id = C.ID,那么 A.ID = C.ID。 所以我能夠直接將 A 連接到 C 而沒有 B 在左邊然后內部連接。

使用您的判斷來確認應如何解決這些表,因為通用的“表 A、B、C”沒有提供真實的上下文,您應該在將來提供更現實的上下文。

where 子句,除了少數例外,幾乎沒有受到影響。 我個人不喜歡 BETWEEN 並更改為 >= [one date] 和 LESS THAN [ending date]。 因此,在您查找 '2020-01-23 00:00:00' 上/之后的示例中,將時間部分關閉是同一回事。 但是,您的結束時間(例如 2020-01-28 23:59:59 之間的 AND 日期)將變為 Date < '2020-01-29'。 因此,它明確包含 2020 年 1 月 28 日至並包括任何時間部分 23:59:59 的所有內容。 凈結果相同,但對我和可能其他人來說,比繞頭更明確。

最后,總結。 您正在尋找每個客戶每個里程碑日期/時間段的金額。 日期的 where 子句包括整個期間與單獨的選擇/聯合。 SUM() 現在已成為 SUM( case/when ) 條件,因此它僅根據限定日期求和。

為了給你一些額外的東西,我添加了一個額外的級別來顯示每個時期和目的的總數(准備預訂與已經預訂)。 因此,現在您在每個客戶端的單行與每個客戶端的多行上分別擁有每個組件和總計。 同樣,這只是聚合的一種選擇。 如果客戶在一個時間段內沒有活動而在另一個時間段內有活動怎么辦……而不同的客戶可能有相反的或兩者都有。 這也允許在同一行上對每個客戶端進行匯總。

SELECT  
        A.ClientID,  

        SUM( case when A.Milestone = 'Ready to Book'
                    AND A.MilestoneDate >= '2020-01-29' AND A.MilestoneDate < '2020-01-30'
                then A.totalamount else 0 end ) ReadyToBookMilestone1,
        SUM( case when A.Milestone = 'Ready to Book'
                    AND A.MilestoneDate >= '2020-01-23' AND A.MilestoneDate < '2020-01-29'
                then A.totalamount else 0 end ) ReadyToBookMilestone2,
        SUM( case when A.Milestone = 'Ready to Book'
                then A.totalamount else 0 end ) ReadyToBookTotalMilestone,

        SUM( case when A.Milestone = 'Already Booked'
                    AND A.MilestoneDate >= '2020-01-29' AND A.MilestoneDate < '2020-01-30'
                then A.totalamount else 0 end ) AlreadyBookedMilestone1,
        SUM( case when A.Milestone = 'Already Booked'
                    AND A.MilestoneDate >= '2020-01-23' AND A.MilestoneDate < '2020-01-29'
                then A.totalamount else 0 end ) AlreadyBookedMilestone2,
        SUM( case when A.Milestone = 'Already Booked'
                then A.totalamount else 0 end ) AlreadyBookedTotalMilestone,

        SUM( case when A.MilestoneDate >= '2020-01-29' AND A.MilestoneDate < '2020-01-30'
                then A.totalamount else 0 end ) TotalMilestone1,
        SUM( case when A.MilestoneDate >= '2020-01-23' AND A.MilestoneDate < '2020-01-29'
                then A.totalamount else 0 end ) TotalMilestone2,
        SUM(A.totalamount)  TotalAllMilestones
    FROM 
        TableA A
            Left JOIN TableB B
                ON A.id = B.id
                AND B.HexaID <> ''
            JOIN TableC C
                on A.id = C.id 
                And C.AcceptedDate IS NULL
    WHERE 
            A.Milestone IN ('Ready to Book', 'Already Booked') 
        AND A.Type IN ( 'Purchase','Refinance','Purchase / Refinance','Variation - Docs Only','Upstamp','Refinance (unattended)' ) 
        AND A.MilestoneDate>= '2020-01-23'
        AND A.MilestoneDate < '2020-01-30'
    GROUP BY 
        TableA.clientID

關於連接輔助表(B 和 C)時求和的最后一個說明。 如果表 B 和 C 可以分別有多行,那么您的聚合將是笛卡爾結果的結果,並且可以/將被誇大。 Ex One Client, Table B ID... 和 Table B 有 3 個具有不同 hexaID 值的記錄。 那么單個 A 金額 10 美元現在可以變成 30 美元,因為它符合表 B 中的每一行......如果表 C 中有多個記錄,可以將 30 美元變成 60 美元、90 美元或更多,作為基於“B”記錄的倍數. 這是將來提供每個表的更明確詳細信息更為關鍵的地方。 不要讓我們猜測輔助表的上下文,它們是 1:1、1:many 關系等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM