SQL count(),尝试计算两个表中的行并限制显示的信息

时间:2011-11-06 17:06:55

标签: sql database count

我正在建立一个数据库,该数据库对可以注册课程的人数有限制。在我的课程表中,我有一个包含int的Maximum列,在我的注册表中,它包含该课程的所有注册人员。因此,我的网页应该只显示注册表中注册人数<1的课程时间。课程表中允许的最大值。继承了我目前的疑问。

SELECT course.time,COUNT(registered.time),registered.maximum FROM course 
JOIN  (registered) 
ON course.type = 'computing' OR 
(registered.type = 'computing' AND course.time = registered.time) 
GROUP BY course.time 
HAVING COUNT(registered.time) < course.maximum 

这个问题是无论课程时间如何都会计算所有注册人数,因此如果有2人在不同时间注册,则每次注册的人数仍为2人。

希望我解释好,希望有人可以提供帮助。感谢

1 个答案:

答案 0 :(得分:0)

我不清楚为什么你有registered.maximumcourse.maximum。如果我们知道实际的表结构,而不是根据您的代码进行猜测,那么回答这个问题会更容易。但是这里有:

SELECT course.time, COUNT(registered.time), registered.maximum 
FROM course 
  JOIN  registered 
    ON course.type = registered.type 
    AND course.time = registered.time
WHERE course.type = 'computing'
GROUP BY course.time, registered.maximum 
HAVING COUNT(registered.time) < course.maximum 

我还在registered.maximum上创建了一个小组,因为否则会出现语法错误。

最后,我将连接更改为类型,然后将其添加到WHERE子句中。对我而言,这总是更有意义,尽管它有时可能会更慢。从我的角度来看,JOIN子句仅用于连接,而WHERE子句用于过滤。

更新:也可以获得没有注册的课程:

SELECT course.time, COUNT(registered.time), course.maximum 
FROM course 
  LEFT OUTER JOIN  registered 
    ON course.type = registered.type 
    AND course.time = registered.time
WHERE course.type = 'computing'
GROUP BY course.time, course.maximum 
HAVING COUNT(registered.time) < course.maximum