2012-04-19 13 views
1

私たちが購読者に送る各ニュースレターの内容を格納するテーブル 'apst_mailings'でクエリを実行しようとしています。電子メールを個人に送信しようとするたびに、apst_mailings_accusesに送信の時刻と状態、および新しいメールのIDを報告する行が挿入されます。私は、ニュースレターのリストを作成し、送信された合計と各自の送信に成功したものを数えたいと思います。2同じテーブルのLEFT OUTER JOINがサーバーをフリーズします

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

クエリで何を達成しようとしていますか?なぜ1つのテーブルを2回結合するのですか? –

+0

私の質問を更新しました。 – Nabab

答えて

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行に参加しているので、あなたのクエリが動作しない理由は、巨大なクロスでサブクエリBを持つすべての一致する行が参加。これにより、巨大な一時的な結果セットが生成される可能性があります。これはおそらく、クエリが永遠に終了する理由です。そしてそれが終了しても、あなたのカウントは完全にオフになります - それは2つのカウントの積になります。

最初に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

+0

@Nabab:サブクエリにあります。コードを参照してください。 –

+0

ワウ!乾杯!私は第二のものが大好きです。ありがとうございました – Nabab

関連する問題