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 回答