count+group\u concat with group by返回错误值

krcsximq  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(339)

下面的查询旨在返回一个事件列表,其中包含事件名称、分配给事件的用户数、留下的评论数以及分配给事件的用户的一组名称。
如果我把join放在comments或assignments表上,而不是同时放在这两个表上,一切都正常!
如果我把两个数都加起来,所有的数都会相乘。如果一个事件有3条评论,并且分配了5个用户,则评论计数和用户计数将为5 x 3=15。此外,组\u concat将返回每个用户名3次,如下所示: Joe, Joe, Joe, Mike, Mike, Mike,... 而不是 Joe, Mike,... 我希望有人能解释一下原因。并发布解决方案:)

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
osh3o9ms

osh3o9ms1#

你沿着不同的维度聚集,所以你得到了每个事件的笛卡尔积。
有几种解决办法。一种是预先聚合每个表。我将建议一个替代的相关子查询:

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 钥匙。

相关问题