带GROUP BY的COUNT + GROUP_CONCAT返回错误的值

时间:2018-05-02 16:19:40

标签: mysql sql

下面的查询旨在返回一个事件列表,其中包含事件名称,分配给事件的COUNT个用户,剩余COUNT个注释以及分配给事件的用户名称的GROUP_CONCAT。

如果我在评论或作业表上左键加入,但两者都没有,那么一切正常!

如果我加入,所有计数都会相互增加。如果一个事件有3个注释,5个用户分配了注释计数,用户数将是5 x 3 = 15.此外,GROUP_CONCAT将返回每个用户名3次,如:Joe, Joe, Joe, Mike, Mike, Mike,...而不是Joe, Mike,... < / p>

我希望有人能解释原因。并发布解决方案:)

SELECT 
    e.id_eve,
    e.title_eve,
    v.name_ven,
    COUNT(a.ideve_ass) AS count_ass,
    COUNT(c.ideve_com) AS count_com,
    GROUP_CONCAT(u.firstname_usr) AS users_eve
FROM 
    rsevents_eve AS e
    LEFT JOIN venues_ven v ON e.idven_eve = v.id_ven
    LEFT JOIN rscomments_com c ON c.ideve_com = e.id_eve
    LEFT JOIN rsassignments_ass a ON a.ideve_ass = e.id_eve
    LEFT JOIN users_usr u ON u.id_usr = a.idusr_ass
GROUP BY 
    e.id_eve

1 个答案:

答案 0 :(得分:0)

您正在聚合不同的维度,因此您将获得每个活动的笛卡尔积。

有几种解决方案。一种是预先聚合每个表。我将建议一个替代的,相关的子查询:

SELECT e.id_eve, e.title_eve, v.name_ven,
       (SELECT COUNT(*)
        FROM rsassignments_ass a 
        WHERE a.ideve_ass = e.id_eve
       ) as count_ass,
       (SELECT COUNT(*)
        FROM rscomments_com c 
        WHERE c.ideve_com = e.id_eve
       ) as count_com,
       (SELECT GROUP_CONCAT(u.firstname_usr)
        FROM users_usr u JOIN
             rsassignments_ass a 
             ON u.id_usr = a.idusr_ass
        WHERE a.ideve_ass = e.id_eve
       ) as users_eve
FROM rsevents_eve e LEFT JOIN
     venues_ven v
     ON e.idven_eve = v.id_ven;

解决此问题的第三种方法是将DISTINCT放入每个COUNT()GROUP_CONCAT()。但是,如果您在JOIN键上有索引,则上述应该是最有效的方法。