2012-07-25 58 views
2

我有两个表。一个用于客户,另一个用于客房。 我想用mysql以下要求取回房间什么..mysql比较列count()

  1. 客户在特定的房间数量小于从房间表
  2. 房间里的脑袋是不是在客户表

你可能看看这个贴 http://pastebin.com/WgTtkQvD

,你只能看到房间1不是预期的结果,因为它的“头”,总客户在T帽子房间等于

室2有3个客户是小于的房间“头” 2

室3和4是在预料之中的结果,因为没有人“占领它尚未

+0

什么是 '头' 的意思? – arkascha 2012-07-25 08:18:46

+0

特定房间中的最大客户 – kapitanluffy 2012-07-25 08:20:24

+0

客户表中有一个客户正在使用房间1.在房间表中,“头部”(最大客户数)等于1 – kapitanluffy 2012-07-25 08:22:14

回答

5
SELECT Rooms.id AS room_id, 
     COUNT(Customer.id) AS occupied, 
     Rooms.head AS total_head, 
     Rooms.head - COUNT(Customer.id) AS remaining_head 
FROM  Rooms LEFT JOIN Customer ON Customer.room_id = Rooms.id 
GROUP BY Rooms.id 
HAVING remaining_head > 0 

请参阅sqlfiddle

+0

您能否向我解释如何分组并一直工作?也对左连接部分感到困惑。感谢:D – kapitanluffy 2012-07-25 08:29:26

+1

@kapitanluffy:阅读[SQL连接的可视化解释](http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of- sql-joins.html)来理解一个'LEFT JOIN'。 'GROUP BY Rooms.id'将'Rooms.id'中所有具有相同值的记录聚合成单个记录(所以COUNT()函数在每个这样的组上执行)。 'HAVING'然后过滤结果组,就像在执行任何分组之前'WHERE'过滤器记录一样。 – eggyal 2012-07-25 08:31:36

0

的下面应该做的伎俩:

SELECT r.id, COUNT(c.id), r.head, r.head - COUNT(c.id) FROM Rooms AS r LEFT JOIN Customer AS c ON r.id = c.room_id WHERE r.head <= COUNT(c.id) GROUP BY r.id 

我没有完全理解你的问题,我还没有真正尝试这在真实的数据库,所以可能会有一些小问题进行梳理。评论它还有更多的问题出现。

0

让我知道这是否正常工作

select r.id,c.occ_cnt as occupied,r.head as total_head,r.head - c.occ_cnt as  remaining_head 
from room r, 
(
select room_id,count(id) as occ_cnt 
from customer 
group by room_id 
) c 
where r.id = c.room_id 
0

试试这个

select 
    r.id,coalesce(ct.counting,0) as occupied,r.head as total_head, 
    r.head-coalesce(ct.counting,0) as remaining_head 
from 
    rooms as r left join 
(
    select room_id,count(id) as counting from customer as ct 
    group by room_id 
) as ct on r.id=ct.room_id 
where r.head-coalesce(ct.counting,0)>0