1

私は非常に基本的なレベルのイベント管理と招待システムを構築しています。そのために、2 つのテーブルを作成し、クエリを使用してすべてのイベントを招待カウント 1 としてリストします。送信された招待の合計 2.受け入れられた招待の合計 3.拒否された合計 4.待機の合計

以下はクエリです

SELECT 
    *, 
    count(im.event_id_fk) as total_invitations, 
    count(im2.event_id_fk) as total_accepted, 
    count(im3.event_id_fk) as total_rejected,
    count(im4.event_id_fk) as total_waiting 
FROM event_mst em
LEFT JOIN invitation_mst im
    ON (em.event_id_pk = im.event_id_fk)
LEFT JOIN invitation_mst im2
    ON (em.event_id_pk = im2.event_id_fk AND im2.status = 'Accept')
LEFT JOIN invitation_mst im3
    ON (em.event_id_pk = im3.event_id_fk AND im3.status = 'Reject')
LEFT JOIN invitation_mst im4
    ON (em.event_id_pk = im4.event_id_fk AND im4.status = 'Waiting')
GROUP BY 
    im.event_id_fk, 
    im2.event_id_fk, 
    im3.event_id_fk, 
    im4.event_id_fk 
ORDER BY 
    em.date_added DESC

ここでの問題は、このクエリが間違ったカウントを与えていることです。たとえば、合計 3 つの招待が送信された場合、9 が返されます。5 つの招待が送信された場合、25 が返されます。

そのため、それ自体で乗算して結果を返しているようです。この選択クエリには何か問題があるはずです。このクエリを修正してくれる人はいますか?

前もって感謝します。

4

1 に答える 1

1

これはブール計算をサポートしているため、mysqlの最も簡単なソリューションです。

SELECT  event_id_pk,
        COUNT(*) as total_invitations, 
        SUM(status = 'Accept') as total_accepted, 
        SUM(status = 'Reject') as total_rejected,
        SUM(status = 'Waiting') as total_waiting 
FROM    event_mst
GROUP   BY event_id_pk

ただし、クエリでは招待の完全な詳細は提供されません。そのために、クエリをサブクエリでラップし、元のテーブル自体と結合することができます。

SELECT  a.*,
        b.total_invitations,
        b.total_rejected,
        b.total_waiting
FROM    event_mst a
        INNER JOIN
        (
            SELECT  event_id_pk,
                    COUNT(*) as total_invitations, 
                    SUM(status = 'Accept') as total_accepted, 
                    SUM(status = 'Reject') as total_rejected,
                    SUM(status = 'Waiting') as total_waiting 
            FROM    event_mst
            GROUP   BY event_id_pk
        ) b ON a.event_id_pk = b.event_id_pk
于 2013-03-14T07:12:07.777 に答える