如何使用一个SQL查询获得多个连接的多个计数?

时间:2018-03-14 14:30:11

标签: mysql sql join group-by count

我的查询中有错误,我想要一些帮助。我有三张桌子

  1. 房间{ID,编号,名称,类型(ECO / LUX),活性的(0/1)}
  2. 男性{护照,roomid,状态(青少年/成人)}
  3. 女性{护照,roomid,状态(青少年/成人)}
  4. **每个房间可以有不止一个女人或男人。

    我想算一下,有多少女性和男性在(1,2,3),状态=' ADULT',类型=' LUX'和active = 1。因此我需要这样的结果:

    +----+--------+-----------+----------+------------+
    | id | number |   name    | CountMen | CountWomen |
    +----+--------+-----------+----------+------------+
    | 1  |     23 | 1st suite |        2 |          4 |
    | 3  |      4 | 2nd suite |        1 |          2 |
    +----+--------+-----------+----------+------------+
    
    SELECT id,number,name,
    sum(case when Men.status='ADULT' then 1 else 0 end) as CountMen,
    sum(case when Women.status='ADULT' then 1 else 0 end) as CountWomen
    FROM Rooms left join Men
    on Rooms.id=Men.roomid
    left join Women on Room.id=Women.roomid where
    (type='LUX') and (active=true) and (id in (1,2,3))
    group by id;
    

    问题是我在计数器中有时会得到错误的结果。

1 个答案:

答案 0 :(得分:1)

left join中, second 表中的条件必须位于on子句中。如果您在查询中限定所有列名称,将会有所帮助。

但问题是因为您在性别表之间获得了笛卡尔积。这绝对是性别隔离不是好事的情况。你应该只有一个表(这甚至不会引起定义二进制性别的其他问题)。

SELECT r.id, r.number, r.name,
       (SELECT COUNT(*)
        FROM men m
        WHERE m.status = 'ADULT' AND r.id = m.roomid
       ) as CountMen,
       (SELECT COUNT(*)
        FROM women w
        WHERE w.status = 'ADULT' AND r.id = w.roomid
       ) as CountWomen
FROM Rooms r 
WHERE r.type = 'LUX' AND r.active = true AND r.id IN (1, 2, 3);

但是,您应该修复数据模型,以便而不是隔离的性别表。