如何使用使用count的sql子查询

时间:2010-08-13 18:41:50

标签: sql mysql count

我有一个系统,其中预留作为记录存储在一个表(workshop_reservation)中,而会话(被保留的东西)存储在另一个表(会话)中。每个预约都属于一个会话,每个会话都属于一个研讨会。

我想创建一个mysql查询,查找属于某个研讨会的每个会话的预留数量。我试图使用count()来查找给定会话中的预留数量,并且此查询可以正常用于此目的(#是会话号):

SELECT count( r.id )
FROM workshop_reservation AS `r`
WHERE r.session_id = #

我想弄清楚如何为每个会话执行此查询。我可以使用以下查询轻松找到每个session_id:

SELECT s.id
FROM session AS `s` 

我的问题是将这些组合在一起,因为当任何会话没有保留时,不会为该会话打印任何行。相反,我希望它在count列中为没有保留的会话打印0。以下查询适用于至少有一个保留的会话,但它会忽略没有保留的会话(不会打印一行说0)。

SELECT count( r.id ) , r.session_id
FROM workshop_reservation AS `r`
WHERE r.session_id
IN (
SELECT s.id
FROM session AS `s`
WHERE s.workshop_id =1
)
AND r.reservation_status_id =0
GROUP BY r.session_id

在这种情况下,如何强制它打印一个带有0的行?

4 个答案:

答案 0 :(得分:3)

您不需要子查询。您可以使用一个简单的GROUP BY,当没有对给定会话的预订或预订数量时,它将返回0。

SELECT s.id, count( r.id )
FROM session AS 's' LEFT JOIN workshop_reservation AS `r`
ON s.id=r.session_id
GROUP BY s.id

答案 1 :(得分:1)

您需要使用JOIN

例如

SELECT COUNT( r.id ) , r.session_id
FROM workshop_reservation r
LEFT JOIN sessions s ON r.session_id = s.id
AND r.reservation_status_id =0
GROUP BY r.session_id

答案 2 :(得分:0)

我认为我应该把它放在这里,而不是选择你的一个答案,因为它们都不是单独工作的。我使用了两者中的元素(主要是mdma和nico中的一行)。这是完全符合我要求的查询:

SELECT session.id, count( workshop_reservation.id )
FROM session LEFT JOIN workshop_reservation ON session.id = workshop_reservation.session_id
AND workshop_reservation.reservation_status_id =0
GROUP BY session.id

我不知道这对SQL专家有多明显,但如果将AND更改为WHERE,则实际上会忽略reservation_status_id。

答案 3 :(得分:0)

select s.*, count(wr.id) as num from sessions as s 
  left join workshop_reservation as wr on wr.session_id = s.id
group by s.id