我有一个查询问题。我希望有一个列,其中包含注册课程的人数。
到目前为止,这是我的查询:
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
答案 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