2017-04-10 150 views
0

我有三張桌子: - 房間:有關房間的信息 - 牀:有關與房間相關的房間中的每張牀的信息(類型,...)ID - 分配:有關分配房間中牀位數量的信息一組(2組在一個房間是可能的)需要多個查詢?

我想與牀位數和分配牀位數列表,在一個房間裏

樣品:

SELECT 
COUNT(beds.id) AS beds 
FROM rooms 
JOIN beds ON rooms.id=beds.roomID 
WHERE rooms.id='124' 

給出的牀位數在房間裏(8)。

SELECT 
SUM(requestsAllocations.bedsAllocated) AS allocated, 
from rooms 
join requestsAllocations on requestsAllocations.roomID=rooms.id 
where rooms.id='124' 

給我分配牀的在房間內的數:7(1 + 6)

SELECT 
COUNT(beds.id) AS beds, 
SUM(requestsAllocations.bedsAllocated) AS allocated 
FROM rooms 
JOIN requestsAllocations ON requestsAllocations.roomID=rooms.id 
JOIN beds ON rooms.id=beds.roomID 
WHERE rooms.id='124' 

給我:

beds | allocated 
---------------- 
16 | 56 
  • 16牀(計數兩次由於分配表中的2條記錄)
  • 56分配牀位(7 * 8 = 56)

如何查詢以獲得正確的結果?

beds | allocated 
---------------- 
8 | 7 

謝謝!

回答

0

要獲得牀的正確數量,你可以再補充一個不同的你count

COUNT(distinct beds.id) AS beds 

爲了避免分配牀的乘法,可以使用一種變通方法類似

SUM(requestsAllocations.bedsAllocated)/COUNT(distinct beds.id) as allocated 

最終的查詢是

SELECT COUNT(distinct t3.id) AS beds, 
     SUM(t2.bedsAllocated)/COUNT(distinct t3.id) AS allocated 
FROM rooms t1 
JOIN requestsAllocations t2 
ON  t2.roomID = t1.id 
JOIN beds t3 
ON  t1.id = t3.roomID 
WHERE t1.id='124' 

我也給了別名,你以提高可讀性

0

您必須在子查詢中至少執行一個聚合(countsum),以便重複記錄不會影響聚合結果。或者你可以簡單地聚集在兩個相關子查詢在選擇列表:

select rooms.id, 
     (select count(*) from beds where beds.roomID=rooms.id) as bed_count, 
     (select sum(bedsAllocated) from requestsAllocations where requestsAllocations.roomID=rooms.id) as allocated_count 
from rooms