2016-05-31 2 views
0

Я довольно застрял в здании запроса, который должен рассчитывать appearences особых случаевSQL присоединяется + Считает

у меня есть:

teachers {id, email, first_name, last_name,...} 
faculties {id, name} 
pupils {id, name, teacher_id} //every pupil has their own curator 
faculties_teachers {id, teacher_id, faculty_id} 

Запрос пытается проверить целостность данных. Не должно быть дубликатов.

Мне нужно получить запрос с количеством учеников на одного преподавателя на факультете.

Этот запрос работал абсолютно нормально, пока я не добавил мои попытки подсчета отдельных учеников за способностей (они действительно, уникально в моем случае :))

SELECT u1.id, u2.id, u1.owner, u2.owner, u1.email, u1.first_name, u2.last_name, u1.name_of_site, faculties_teachers.faculty_id, faculties.name, 
     (SELECT COUNT(pupils.*) FROM pupils as p WHERE faculties.id = pupils.faculty_id) 
FROM `teachers` AS u1 
JOIN `teachers` AS u2 ON u1.email = u2.email 
JOIN `faculties_teachers` AS ft ON u1.id = ft.teacher_id 
JOIN `faculties` ON faculties.id = ft.faculty_id 
JOIN `pupils` ON faculties.id = pupils.faculty_id 
WHERE u1.id < u2.id 
ORDER BY `u1`.`id` ASC 
+1

Что вы дважды присоединяете к «учителям»? Примеры данных и желаемые результаты помогут, а также объяснение того, что вы хотите сделать. –

+0

Привет, Gordon, У нас было несколько вопросов в нашей системе: - неправильная функция 'teacher delete', которая стирает только учителей, без зависимостей (в faculties_teachers). В результате, когда кто-то хочет получить всех преподавателей на факультете, они видят много пустых строк, что совершенно неправильно. - неправильная функция «преподавателей-преподавателей на факультет» ... которая удвоила данные учителей .... Итак, в одном запросе я хотел «убить их всех» :) Сейчас у меня есть огромное количество работы, но позже Я исправлю этот вопрос. Я считаю это полезным. –

ответ

0

Хехе - спасибо моему коллеге

SELECT u1.id, u2.id, u1.owner, u2.owner, u1.email, u1.first_name, u2.last_name, u1.name_of_site, faculties_teachers.faculty_id, faculties.name, COALESCE(pupil_counts_by_faculties.pupil_cnt, 0) AS pupil_cnt 
FROM `teachers` AS u1 
JOIN `teachers` AS u2 ON u1.email = u2.email 
JOIN `faculties_teachers` ON u1.id = faculties_teachers.urid 
JOIN `faculties` ON faculties.id = faculties_teachers.faculty_id 
LEFT JOIN (
    SELECT `faculty_id`, COUNT(*) AS pupil_cnt 
    FROM `pupils` 
    GROUP BY `faculty_id` 
) AS pupil_counts_by_faculties ON `faculties`.`id` = pupil_counts_by_faculties.faculty_id 
WHERE u1.id < u2.id