2015-02-15 4 views
2

Я пытаюсь получить номера класса с графиком конечно перекрытия, мои таблицы: курсы:SQL HAVING макс (количество()) возвращают нулевые строки

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 

class_room:

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

My 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 такой строки в настоящее время). I судимого

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; 

Но возвращает пустую таблицу. Что не так? Или, может быть, предложение другого решения, чтобы получить то, что мне нужно?

+0

Не могли бы вы дать ae набор данных xample для тестирования? Например. к скрипту SQL. –

+0

Я добавил все данные. Я делаю свой тест с – Sergey

+0

Замените 'max (count)' на 'count (курсы.COURSE_ID) = 1'. –

ответ

1

После возвратит все группы, соответствующие максимальное количество

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 
        ) 
+0

Отлично, спасибо – Sergey

0

Это возвращает все строки с наибольшим кол:

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

Смежные вопросы