Left Join сортировка запроса
Запрос должен выдавать имя группы и количество студентов у которых id_sex = 1(только группы в которых только мужчины). А выдает просто имя группы и количество мужчин в ней. Что не так то?
select
grupa.name as grupa_name,
count(student.id) as grupa_count
from student
left join grupa on grupa.id=student.id_grupa
where student.id_sex = 1
group by grupa_name
order by grupa_count
Ответы (2 шт):
Вы отфильтровываете по условию where, которое работает до группировки. Вам необходимо в процессе группировки получить значение, определяющее пол в группе (только мужчины). Учитывая то, что здесь sex имеет формат (1,0) вам достаточно определить минимальное значение sex в группе, если оно 1, то в группе нет ни единной девушки. Это условие стоит реализовать в having
Код:
select
g.name as grupa_name,
count(s.id) as grupa_count
min(s.id_sex) as hasNotFemale
from student as s
left join grupa as g
on g.id=s.id_grupa
group by grupa_name
having hasNotFemale = 1
p.s. в зависимости от диалекта sql синтаксис может незначительно отличаться.
UPD для будущих поколений
Если формат поля sex не (1, 0) то поле легко приводится к такому с помощью оператора case
select
grupa.name as grupa_name,
count(student.id) as total_count,
SUM(student.id_sex = 1) AS male_count
from student
left join grupa on grupa.id=student.id_grupa
group by grupa_name
/* HAVING total_count = male_count */