выберите количество внутри выберите Dinstinct

mysql

39 просмотра

2 ответа

У меня есть таблица с именем , attendanceкоторое имеет столбцы roll, class_id, statusи att_date.
У меня есть другая таблица с именем , classкоторое имеет столбцы class_idи name.
Я хочу , чтобы выбрать отчетливый class_idи сосчитать numberиз rollкоторых имеет , status = 1где , date="some_date"а затем подключить его к классу таблицы , используя inner join.и снова применять , где филиал = «Информатика»

Но я столкнулся с некоторой проблемой. Это пример посещаемости моего стола:

roll | class_id | status | att_date
abc  |    1     |   0    | 19-06-2016
cvb  |    2     |   1    | 19-06-2016
nbs  |    1     |   1    | 19-06-2016
lkl  |    3     |   1    | 19-06-2016
ewq  |    3     |   1    | 19-06-2016
dff  |    2     |   1    | 19-06-2016
xyz  |    2     |   1    | 19-06-2016

Это пример моего класса таблицы:

id  |  name | branch
1   |  CS4  | Computer Science
2   |  CS5  | Computer Science
3   |  CS6  | Mechanical

и я хочу что-то вроде этого:

total number of roll with status 1 | class_id  | name
1                                  |    1      | CS4
3                                  |    2      | CS5
2                                  |    3      | CS6

Может кто-нибудь объяснить мне?
Как я могу подойти с запросом?

Автор: Tom Cruise Источник Размещён: 08.11.2019 11:14

Ответы (2)


2 плюса

Решение

Используйте в group byпределах group by:

select cnt, count(*) as num_status_1,
       group_concat(a.class_id order by a.class_id) as class_ids,
       group_concat(c.name order by a.class_id) as class_names
from (select class_id, count(*) as cnt 
      from attendance
      where status = 1
      group by class_id
     ) a join
     class c
     on a.class_id = c.class_id
group by cnt;

РЕДАКТИРОВАТЬ:

Примечание: это агрегирует cnt, и вы можете этого не делать (ваши результаты неоднозначны). Этого может быть достаточно:

select cnt,
       a.class_id, c.nameclass_names
from (select class_id, count(*) as cnt 
      from attendance
      where status = 1
      group by class_id
     ) a join
     class c
     on a.class_id = c.id;

Или даже:

select c.*,
       (select count(*) from attendance a where a.status = 1 and a.class_id = c.id)
from class c;
Автор: Gordon Linoff Размещён: 20.08.2016 11:31

0 плюса

Я думаю, что это более простой способ сделать работу:

select a.class_id, b.name, count(a.*) as tot_status_1 
    from attendance a, class b 
    where a.class_id=b.id and a.status=1
Автор: Partha Mitra Размещён: 20.08.2016 11:59
Вопросы из категории :
32x32