1

購読者に送信する各ニュースレターのコンテンツを格納するテーブル '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

クエリを分割することはできましたが、それが機能しない理由が本当に気になります。誰でも説明できますか?

ありがとう!

4

1 に答える 1

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

ただし、クエリが機能しない理由は、サブクエリaのすべての行を、サブクエリ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
于 2012-04-19T21:08:49.967 に答える