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 шт):

Автор решения: HackerU

Вы отфильтровываете по условию 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

→ Ссылка
Автор решения: Akina
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 */
→ Ссылка