Mysql 多查询';需要什么?

Mysql 多查询';需要什么?,mysql,Mysql,我有三张桌子: -房间:关于房间的信息 -床:房间中每个床的信息(类型,…)链接到带有roomID的房间 -分配:关于分配给一个组的房间的床位数的信息(一个房间可以有两个组) 我想要一份有床位数和房间内分配床位数的清单 样本: SELECT COUNT(beds.id) AS beds FROM rooms JOIN beds ON rooms.id=beds.roomID WHERE rooms.id='124' 给出房间中的床数(8) 给我房间里分配的床位数:7(1+6) 给我: b

我有三张桌子: -房间:关于房间的信息 -床:房间中每个床的信息(类型,…)链接到带有roomID的房间 -分配:关于分配给一个组的房间的床位数的信息(一个房间可以有两个组)

我想要一份有床位数和房间内分配床位数的清单

样本:

SELECT 
COUNT(beds.id) AS beds
FROM rooms 
JOIN beds ON rooms.id=beds.roomID 
WHERE rooms.id='124'
给出房间中的床数(8)

给我房间里分配的床位数:7(1+6)

给我:

beds | allocated
----------------
16   | 56
  • 16张床位(由于分配表中有2条记录,所以计数两次)
  • 56张分配床位(7*8=56)
如何进行查询以获得正确的结果

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

谢谢

要获得正确的床位数量,您只需在您的
计数中添加一个distinct

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'

我还为您的表提供了别名以提高可读性

您必须在子查询中至少进行一次聚合(无论是
计数
还是
总和
),以便重复记录不会影响聚合结果。或者,您可以简单地在选择列表中聚合两个相关子查询:

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
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'
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