2012-07-25 59 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