关系代数与聚合

时间:2013-04-20 13:53:28

标签: mysql sql

对于今天入住超过10名病人的每个病房,列出病房名称,病房类型和病房数量

提供以下架构:

Patient(PatNo, patName, patAddress, DOB)
Ward (wardNo, wardName, wardType, noOfBeds)
Contains (PatNo, WardNo, admissionDate)

这是我的SQL:

select PatNo, wardNo, wardName, wardType, noOfBeds
  from Ward w , Contains c
 where w.wardNo = c.WardNo 
   and count(c.patNo) > 10 
   and c.admissionDate = getDate();

我不明白如何使用关系代数的聚合。

2 个答案:

答案 0 :(得分:2)

两件事。首先,

and c.admissionDate = getDate();

getDate()返回一个日期时间,因此几乎不会返回任何内容。你可能想要

and c.admissionDate = cast(getDate() as date);

接下来,您不希望在where子句中使用聚合。你想要:

having count(c.PatNo) > 10

and (subquery to get admitted patient count) > 10

答案 1 :(得分:1)

当前日期的MySQL函数是now()而不是getdate()。试试这个:

select PatNo, wardNo, wardName, wardType, noOfBeds
  from Ward w join
       Contains c
       on w.wardNo = c.WardNo 
 where c.admissionDate = date(now())
 group by c.patno
 having count(c.patNo) > 10 

您的查询需要group by子句进行聚合。 count上的条件需要在having子句中,而不是在where子句中(在聚合之前而不是之后使用)。

我将查询更改为使用标准联接。