一些SQL查询我无法弄清楚如何编写

时间:2013-05-06 10:57:42

标签: mysql sql database schema

我需要使用以下架构为数据库创建一些查询:

Patient(**pid**,pname,address,phone)
Ward(**wid**, wname) // wid=Ward id,
Bed(**wid,bid**) // bid=Bed id
Appointment(**apid**,date,result,pid,cid) // cid=Consultant id, pid=Patient id
Consultant(**cid**,cname,clinId,phone) // clinId=Clinic ID
Allocation(**apid**,pid,wid,bid,date,ex_leave,act_leave) //ex=expected, act=actual

查询是:

  1. 找出每个病房里有多少个空床。
  2. 查找2013年3月每天分配给它的病房。
  3. 返回执行大多数约会的人的顾问详情 分配在骨科病房。
  4. 我尝试使用这样的视图创建第一个:

    create view hospital.occupied_beds as
    select A.wid,count(*) as o_beds
    from hospital.allocation A,hospital.bed B 
    where A.wid=B.wid and A.bid=B.bid and A.act_leave is null
    group by A.wid;
    
    create view hospital.all_beds as
    select C.wid,count(*) as all_beds
    from hospital.bed C
    group by C.wid;
    
    select distinct A.wid,all_beds-o_beds as uo_beds
    from hospital.occupied_beds A, hospital.all_beds B
    

    但这样一来,它就不会让所有病床都无人居住。

    请帮帮我:)。

3 个答案:

答案 0 :(得分:0)

似乎规范化程度有点差,因为Allocation可以指定病房ID和病床ID。床ID是否可以为空,例如患者还没有分配床?

无论如何,我认为你需要外连接。我现在没有可用的MySQL副本,但我相信你可以这样做:

create view hospital.unoccupied_beds as
select B.wid,count(*) as o_beds
from hospital.allocation A right join hospital.bed B on A.wid=B.wid and A.bid=B.bid and A.act_leave is null
where A.apid is null
group by B.wid;

答案 1 :(得分:0)

可能是这样的: 你只需要计算一下:

Select Sub1.v1, Sub1.c1 as all, Sub2.c2 as free FROM
(SELECT wid.bed as v1,count(bid.bed) as c1 FROM bed, ward WHERE wid.ward =  wid.bed 
GROUP BY wid.bed) Sub1
LEFT JOIN
(SELECT wid.bed as v2,count(bid.bed) as c2 FROM bed, ward, allocation WHERE 
wid.ward =  wid.bed AND wid.bed = wid.allocation 
AND bid.bed = bid.allocation AND act_leave.allocation IS NULL GROUP BY wid.bed) Sub2
ON Sub1.v1 = Sub2.v2

答案 2 :(得分:0)

以下是针对您的问题的三种可能解决方案。请记住,我不是为了提高效率。可能有一些方法可以优化这些查询。我只想给你一些想法,让你朝着正确的方向前进。

每个病房的未受病床:

select w.wname, bc.total - IFNULL(ob.occupied,0) as unoccupied
from Ward w,
(select wid, count(bid) as total from Bed group by wid) bc
left join (select wid, count(wid) as occupied from Allocation where act_leave is null   group by wid) ob
on bc.wid = ob.wid
where w.wid = bc.wid

对于2013年3月每天分配的病房

select w.wid, w.wname, count(distinct(a.date)) as acount
from Ward w, Allocation a
where a.date >= '2013-03-01'
and a.date <= '2013-03-31'
and w.wid = a.wid
group by w.wid
having acount = 31

大多数正交约会的顾问列表按降序排列(大多数分配在最上面)

select c.cid, c.cname, count(a.apid) as apptcount
from Consultant c, Appointment p, Allocation a, Ward w
where c.cid = p.cid
and p.apid = a.apid
and a.wid = w.wid
and w.wname = 'Orthopedic'
group by c.cid
order by apptcount desc