簡體   English   中英

同一表上的2 LEFT OUTER JOIN會凍結服務器

[英]2 LEFT OUTER JOIN on the same table freezes server

我正在嘗試在表'apst_mailings'上運行查詢,該表存儲我們發送給訂戶的每個新聞通訊的內容。 每次我們嘗試向個人發送電子郵件時,我們都會在apst_mailings_accuses中插入一行,以報告發送時間和狀態以及通訊的ID。 我想列出新聞通訊,並計算每個通訊已發送和成功發送的總數。

    SELECT m.id AS code_mailing, 
    COUNT(a.adh_code) AS num, COUNT(b.adh_code) AS succes
    FROM apst_mailings AS m
        LEFT OUTER JOIN apst_mailings_accuses AS a
            ON a.id_mailing = m.id
        LEFT OUTER JOIN apst_mailings_accuses AS b
            ON b.id_mailing = m.id
            AND b.etat = 'succes'
    GROUP BY m.id

它只是將服務器永久掛起。 我曾嘗試在單獨的查詢中的每個聯接,它都可以正常工作:

// Counts the email sent per mailing
    SELECT m.id AS code_mailing, 
    COUNT(a.adh_code) AS num
    FROM apst_mailings AS m
        LEFT OUTER JOIN apst_mailings_accuses AS a
            ON a.id_mailing = m.id
    GROUP BY m.id

    SELECT m.id AS code_mailing, 
    COUNT(b.adh_code) AS succes
    FROM apst_mailings AS m
        LEFT OUTER JOIN apst_mailings_accuses AS b
            ON b.id_mailing = m.id
            AND b.etat = 'succes'
    GROUP BY m.id

我可以拆分查詢,但無法正常工作的原因令我感到困擾。 誰能解釋一下?

謝謝!

通過使用單個聯接並使用SUM執行條件計數,可以以更簡單的方式獲得所需的內容。

SELECT
   m.id AS code_mailing, 
   COUNT(a.adh_code) AS num,
   SUM(a.etat = 'succes') AS succes
FROM apst_mailings AS m
LEFT OUTER JOIN apst_mailings_accuses AS a
ON a.id_mailing = m.id
GROUP BY m.id

但是,為什么您的查詢不工作的原因是因為你在子查詢所有匹配的行加盟子查詢所有b在一個巨大的交叉連接。 這可能會生成一個巨大的臨時結果集,這大概就是為什么查詢需要永遠終止的原因。 即使終止,您的計數也將完全消失-它們將是兩個計數的乘積。

要解決此問題,請先執行GROUP BY 然后將其結果JOIN主表。

SELECT
   m.id AS code_mailing, 
   IFNULL(a.num, 0) AS num,
   IFNULL(b.succes, 0) AS succes
FROM apst_mailings AS m
LEFT OUTER JOIN (
   SELECT id_mailing, COUNT(adh_code) AS num
   FROM apst_mailings_accuses 
   GROUP BY id_mailing
) a
ON a.id_mailing = m.id
LEFT OUTER JOIN (
    SELECT id_mailing, COUNT(adh_code) AS succes
    FROM apst_mailings_accuses
    WHERE etat = 'succes'
    GROUP BY id_mailing
) b
ON b.id_mailing = m.id

暫無
暫無

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

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