SQL-запрос LEFT JOIN (MySQL)

у меня 2 стола

SCHOOLS (ID, SCHOOL_NAME, CITY_ID)
STUDENTS (ID, STUDENT_NAME, SCHOOL_ID).

Я хочу перечислить школы в определенном городе вместе с количеством учеников (Название школы | Количество учеников)

Один из способов сделать это - иметь связанный подзапрос -

select sh.school_name, 
       (select count(*) 
          from student 
         where school_id = sh.id) as student_count 
 from schools sh 
where sh.city_id = 1

Но поскольку связанные запросы не рекомендуются, я хочу избежать этого, и я попробовал группу с помощью -

   select sh.school_name, 
          count(st.school_id) as student_count 
     from schools sh 
left join students st on sh.id = st.school_id 
    where sh.city_id = 1 
 group by st.school_id

Теперь это работает только в том случае, если количество учеников в школе > 0. Поэтому я предполагаю, что концепция левого соединения не работает, то есть если какие-либо школы, в которых нет учеников, должны быть указаны как student_count = 0, но этого не происходит. Интересно то, что я вижу "одну" запись со student_count = 0, но на этом все.

Что-то не так в моем запросе LEFT JOIN??


person kapso    schedule 27.10.2010    source источник


Ответы (2)


Использовать:

   SELECT sh.id,
          sh.school_name, 
          COUNT(st.school_id) as student_count 
     FROM SCHOOLS sh 
LEFT JOIN STUDENTS st on sh.id = st.school_id  
    WHERE sh.city_id = 1 
 GROUP BY sh.id, sh.school_name

Из-за использования LEFT JOIN ссылки на st будут иметь значение NULL, если в школе нет учащихся. COUNT не считает значения NULL, поэтому, если нет связанных студентов, то student_count будет равно нулю.

person OMG Ponies    schedule 27.10.2010
comment
Спасибо за ответ. Я попробовал ваше решение, но оно не работает :( - person kapso; 28.10.2010
comment
@ user310525: Можете ли вы предоставить некоторые данные, чтобы я мог проверить? ЛЕВОЕ СОЕДИНЕНИЕ гарантирует, что школы с нулевым количеством учащихся не будут пропущены из списка. Вы уверены, что в указанном city_id есть школы с нулевыми показателями? - person OMG Ponies; 28.10.2010
comment
да, я уверен, потому что связанный запрос возвращает желаемые результаты (всего возвращаемых строк = 60, учащиеся больше 0 = 6 строк). Но запрос group_by возвращает 6 + 1 строку. Эта 1 строка является первой школьной записью с учеником = 0. - person kapso; 28.10.2010
comment
@ user310525: я как раз собирался опубликовать свои операторы CREATE TABLE и INSERT... =) - person OMG Ponies; 28.10.2010

Попробуйте сгруппировать по sh.id вместо st.school_id

person wllmsaccnt    schedule 27.10.2010