2010-10-06 114 views
1

我正在使用我没有创建的系统。该系统有3个主表:多个字段报告,在MySql中使用自定义计数

用户,课程和用户组。我正在使用一个名为coursehits的额外表格。

这是一个MySQL数据库,5.0。数据库中没有任何关系,因此只需向课程和用户表中的用户组(course_id和user_id)添加条目即可将用户分配到课程中。同样,如果他们开始课程,则会进入课程。

我正在计数报告数据的用户在coursehits和usergroups中的数量。到目前为止,我有这不一个查询正确计算如下但这并不正确计算,结果是太高:

SELECT DISTINCT 
c.course_name, 
COUNT(ug.user_id) AS "Enrolled", 
COUNT(ch.user_id) as "Started" 

FROM courses c, usergroups ug, coursehits ch, users u 

WHERE ch.user_id = u.id 
AND ug.user_id = u.id 
AND ug.course_id = c.id 
AND ch.page_id != 4 
GROUP BY 1 

之前我做的单独下面这不工作:

SELECT DISTINCT c.course_name, COUNT(ug.user_id) AS "Enrolled" 
FROM courses c, usergroups ug 
WHERE ug.course_id = c.id 
GROUP BY 1 

现在,我试图在一个查询中报告每个课程的用户状态,我希望这是有意义的。

+0

有为什么它必须是一个查询任何特定的目的是什么?在SQL中,最好让两个查询分开执行,而不是尝试以某种奇怪的方式进行组合。 – leafnode 2010-10-06 12:24:13

+0

为开发者做这件事,我分别做了两个查询,他们工作得很好,现在做了三分之一。只是方便我想,以及推动我的SQL界限。 – Mathnode 2010-10-06 12:34:49

回答

1

尝试:

SELECT c.course_name, 
     COUNT(DISTINCT ug.user_id) AS "Enrolled", 
     COUNT(DISTINCT ch.user_id) as "Started" 
FROM courses c 
left join usergroups ug on ug.course_id = c.id 
left join coursehits ch on ch.course_id = c.id and ch.page_id != 4 
GROUP BY c.course_name 
+0

这样做非常感谢你,我希望我能给你一点,但我还不够酷:(再次感谢 – Mathnode 2010-10-06 21:12:06

+0

@teatime,如果你很高兴答案解决了你的问题,你应该能够接受它(通过点击答案左边的勾号)。 – 2010-10-07 09:48:42