2012-04-19 68 views
1

我試圖在'apst_mailings'上存儲我們發送給訂閱者的每封新聞稿的內容。每次我們嘗試將電子郵件發送給個人時,我們都會在apst_mailings_accuses中插入一行報告發送時間和狀態以及新信函的ID。我想列出新聞簡報並計算髮送的總數併成功發送。2在同一張桌子上的左外連接凍結服務器

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 

我可能分裂我的查詢,但爲什麼它不工作的原因,我受不了。任何人都可以解釋嗎?

謝謝!

+0

你想用查詢來實現什麼?爲什麼加入一張桌子兩次? – 2012-04-19 21:11:11

+0

剛剛更新了我的問題。 – Nabab 2012-04-19 21:19:07

回答

6

您可以通過使用單個連接並使用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 

但你爲什麼查詢不工作的原因是因爲你在子查詢加入ALL行一個ALL匹配的子查詢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 
+0

首先你是什麼意思?我應該在哪裏放置GROUP BY? – Nabab 2012-04-19 21:12:42

+0

@Nabab:在子查詢中。看代碼。 – 2012-04-19 21:16:26

+0

哇!乾杯!我喜歡第二個。非常感謝 – Nabab 2012-04-19 21:22:10