代码之家  ›  专栏  ›  技术社区  ›  Sergey

sql HAVING max(count())返回零行

  •  2
  • Sergey  · 技术社区  · 10 年前

    我正在尝试获得课程表重叠的教室,我的桌子:课程:

    COURSE_ID    NAME
    11           matematika
    22           logika
    33           himiya
    44           sport
    55           algoritmika
    66           hedva
    77           algebra linearit
    

    时间表:

    ID  COURSE_ID  ID_ROOM  DAY  HOUR
    1   11         105      Mon  10am
    2   11         105      Wen  10am
    3   11         105      Thu  10am
    4   22         105      Mon  10am
    5   22         205      Wen  10am
    6   22         105      Thu  10am
    7   33         305      Mon  11am
    8   33         105      Mon  10am
    

    类_房间:

    ID_ROOM  LOCATION  CAPACITY
    105      A         20
    205      B         10
    305      C         30
    

    我的sql是:

    select class_room.ID_ROOM as crid, class_room.LOCATION, schedule.DAY as d, schedule.HOUR as h,  count(courses.COURSE_ID) as count 
      from schedule
      natural join class_room
      natural join courses
      group by crid, d, h
      order by count desc;
    

    我得到:

    crid  LOCATION  d   h       count
    105   A         Mon 10am    3
    105   A         Thu 10am    2
    305   C         Mon 11am    1
    105   A         Wen 10am    1
    205   B         Wen 10am    1
    

    但我只需要显示计数的所有最大值(目前为1行)。 我试过了

    select class_room.ID_ROOM as crid, class_room.LOCATION, schedule.DAY as d, schedule.HOUR as h,  count(courses.COURSE_ID) as count 
      from schedule
      natural join class_room
      natural join courses
      group by crid, d, h
      having max(count)
      order by count desc;
    

    但返回的是空表。 怎么了?或者,也许是另一个解决方案的建议,以获得我需要的东西?

    2 回复  |  直到 10 年前
        1
  •  1
  •   Lieven Keersmaekers    10 年前

    以下内容将返回匹配最大计数的所有组

    SQL Fiddle

    select  class_room.ID_ROOM as crid
            , class_room.LOCATION
            , schedule.DAY as d
            , schedule.HOUR as h
            ,  count(courses.COURSE_ID) as count 
    from    schedule
            natural join class_room
            natural join courses
    group by 
            crid, d, h
    having count(*) = (
                        select  max(count)
                        from    (            
                                  select  count(courses.COURSE_ID) as count
                                  from    schedule
                                          natural join class_room
                                          natural join courses
                                  group by 
                                          id_room, day, hour
                                ) maxcount
                        )
    
        2
  •  0
  •   dnoeth    10 年前

    这将返回计数最高的所有行:

    select ID_ROOM as crid, DAY as d, HOUR as h,
          count(*) as cnt
    from schedule
    group by crid, d, h
    having
       count(*)
       = ( select count(*) as cnt
           from schedule
           group by ID_ROOM, DAY, HOUR
           order by cnt desc
           limit 1
         )
    

    现在加入到 class_room 获得 location