【问题标题】:Join two tables with group将两个表加入组
【发布时间】:2017-05-05 19:43:53
【问题描述】:

我需要一个查询连接两个表的宿舍(宿舍)数据库的帮助:

房间 - 房间 ID、类别、租金、床位数等

Hosteler - hosteler id、name、room id 等

我需要生成一个结果集,给出所有房间、床位总数和占用数。床位和免费床位等

这是我正在使用的查询:

SELECT r.R_ID , r.R_Beds, count(h.h_id), (r.r_beds-count(h.h_id)) ,
if((r.r_beds-count(h.h_id))>0, 'Available', 'Full' ) , r.r_rent
FROM T_Rooms r LEFT OUTER JOIN t_hostelers h
ON r.r_id = h.h_roomno
WHERE h.h_status= 'active'
GROUP BY h.h_roomno

但我只从房间表中获取在 hostelers 表中具有值的行。我还需要显示其他无人入住的房间。

请帮助我找出我的疏忽或错误。

【问题讨论】:

    标签: mysql join group-by


    【解决方案1】:

    选项 1

    SELECT r.R_ID , r.R_Beds, count(h.h_id), (r.r_beds-count(h.h_id)) ,
    if((r.r_beds-count(h.h_id))>0, 'Available', 'Full' ) , r.r_rent
    FROM T_Rooms r 
    LEFT OUTER JOIN t_hostelers h
      ON r.r_id = h.h_roomno
         AND h.h_status= 'active'
    GROUP BY h.h_roomno
    

    选项 2

    SELECT r.R_ID , r.R_Beds, count(h.h_id), (r.r_beds-count(h.h_id)) ,
    if((r.r_beds-count(h.h_id))>0, 'Available', 'Full' ) , r.r_rent
    FROM T_Rooms r 
    LEFT OUTER JOIN t_hostelers h
      ON r.r_id = h.h_roomno
    WHERE
         (h.h_status= 'active' or H.H_Status is null)
    GROUP BY h.h_roomno
    

    问题是您的 where 子句排除了 t_rooms 中的记录,因为 t_hostelers 中没有记录。要更正,您需要在连接上应用过滤器,使其仅适用于 t_hostelers 或在 where 子句中包含 NULL 结果。

    【讨论】:

    • 实际上,由于 WHERE 子句,行并没有被消除。这是因为对于 T_Rooms 表中的所有行,T_Hosteler 表中不会(或不需要)有行。
    • 那您能否提供一些示例数据和预期结果,因为我不明白这个问题。
    • 我必须不同意您的评论:假设我有 T_ROOM 1,但在 T_Hosteler 中没有记录。当它离开时, 1 仍将在结果集中。但是,当 DBEngine 应用您的 where 子句时,记录 1 将被删除,因为 T_Hostler.H_status 等于 NULL 而不是“活动”,因此任何在 t_Hostlers 中没有记录的房间都将被排除(通过 where 子句)。这否定了左连接的好处。
    猜你喜欢
    • 2014-02-07
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 2018-08-21
    相关资源
    最近更新 更多