下面的查询旨在返回一个事件列表,其中包含事件名称,分配给事件的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
答案 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
键上有索引,则上述应该是最有效的方法。