SQL计数问题

时间:2014-02-21 21:01:49

标签: mysql sql count

我有一个查询问题。我希望有一个列,其中包含注册课程的人数。

到目前为止,这是我的查询:

select
  courses.id, 
  name, 
  location, 
  capacity, 
  (
    SELECT count(courses_requests.IDcourse) 
    FROM courses_requests, courses
    WHERE courses_requests.IDcourse = courses.id AND status != "rejected"
  ) as Registered, 
  begin_date, 
  end_date,  
  price, 
  active
from courses

但是这给了我一些问题,它为所有行显示相同的值,即使该课程没有在课程中注册的人

E.G

Capacity Registered
2        1
30       1

3 个答案:

答案 0 :(得分:1)

聚合外部选择以消除子查询可能更简单,所以类似于:

SELECT      c.id, 
            c.name, 
            c.location, 
            c.capacity, 
            COUNT(cr.IDcourse) AS RequestCount 
            c.begin_date, 
            c.end_date,  
            c.price, 
            c.active

FROM        courses c

INNER JOIN  courses_requests cr
    ON      cr.IDcourse = c.id 
    AND     status != "rejected"

GROUP BY    c.id, 
            c.name, 
            c.location, 
            c.capacity, 
            c.begin_date, 
            c.end_date,  
            c.price, 
            c.active

答案 1 :(得分:0)

您应该将子查询连接到主查询:

select courses.id, 
    courses.name, 
    courses.location, 
    courses.capacity, 
    (SELECT count(courses_requests.IDcourse) 
          FROM    courses_requests, 
           WHERE courses_requests.ID = courses.id 
            and status != "rejected" ) as Registered, 
    begin_date, 
    end_date,  
    price, 
    active
    from courses

答案 2 :(得分:0)

您可以使用join来简化查询,并使用SUM()条件将为您提供计数

select
  c.id, 
  c.name, 
  c.location, 
  c.capacity, 
  SUM(cr.status != "rejected") as Registered, 
  c.begin_date, 
  c.end_date,  
  c.price, 
  c.active
from courses c
JOIN courses_requests cr ON (cr.IDcourse = c.id)
GROUP BY c.id