2012-04-19 69 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