2016-11-04 55 views
0

我试图为人们查看可用的&已取消的类的列表,不知何故,我的SQL只打印只保留该类的人,类人们永远不会保留它从不显示。当COUNT值等于零时,SQL失败/不生成

我怀疑它是因为HAVING只导致生成保留类。

我的表:

CID, ClassLevel, 起始日期, 开始时间, 时间, Descp, 状态, TID

enter image description here ClassReservation

预留ID, MID, CID, 状态

enter image description here

时可能会产生只显示人保留类,但类是创建一个人都没有储备将不会出现。

enter image description here

SELECT Classes.CID 
    ,'Date: ' & Classes.StartDate & ', Start Time: ' & Classes.StartTime & ', Duration: ' & Classes.Duration & ', Description: ' & Classes.Descp & ', Status: ' & Classes.STATUS AS CCOM 
FROM Classes 
INNER JOIN ClassesReservation ON Classes.CID = ClassesReservation.CID 
WHERE (
     Classes.STATUS = 'active' 
     OR Classes.STATUS = 'cancelled' 
     ) 
    AND Classes.StartDATE > NOW 
GROUP BY Classes.CID 
    ,Classes.StartDate 
    ,Classes.StartTime 
    ,Classes.Duration 
    ,Classes.Descp 
    ,Classes.STATUS 
HAVING COUNT(ClassesReservation.CID) < 20 
    OR COUNT(ClassesReservation.CID) > 0 
+0

你可以在这里描述样本表数据 –

+2

所有数字都满足这个条件。我想你想的'和' – pinkfloydx33

+1

尝试使用'留下join' –

回答

0

我会写这样的查询:

SELECT c.CID, 
     ('Date: ' & c.StartDate & ', Start Time: ' & c.StartTime & ', Duration: ' & Classes.Duration & ', Description: ' & c.Descp & ', Status: ' & c.STATUS 
     ) AS CCOM 
FROM Classes as c INNER JOIN 
    (SELECT cr.CID, COUNT(*) as NumReserved 
     FROM ClassesReservation as cr 
     GROUP BY cr.CID 
    ) cr 
    ON c.CID = cr.CID 
WHERE c.STATUS IN ('active', 'cancelled') AND 
     c.StartDATE > NOW 
HAVING cr.NumReserved > 0 AND cr.NumReserved < 20; 

注:

  • 表的别名使查询更容易编写和阅读。
  • IN比一堆=子句更可读通过OR连接。
  • 移动聚合成一个子查询,简化了查询。
  • 你真正的问题可能仅仅是HAVING子句中的OR
相关问题