我有一个系统,其中预留作为记录存储在一个表(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的行?
答案 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