Сложный sql запрос из нескольких таблиц для сводной таблицы

Рейтинг: 1Ответов: 1Опубликовано: 19.01.2015

Доброе время всем!

Банальная задача составить запрос (или несколько) из многих таблиц для создания сводной таблицы.

Есть 5 таблиц:

lessons (уроки) с полями: id|title|date
evals (оценки) с полями: id|eval|lesson_id|pupil_id|subject_id|date
subjects (предметы) с полями: id|title
pupils (ученики) с полями: id|firstname|lastname
absent (пропуски) с полями: id|pupil_id|lesson_id

Составить таблицу в виде страницы школьного журнала:

Alt text

N - любое число (то есть кол-во учеников и уроков произвольное).
Задачу решил, используя циклы в php. Работает нормально, пока записей в таблицах мало. Как только оценок наберется пару миллионов, уроков полмиллиона, то виснет страшно. Подскажите способ избежать циклов. Направьте на верное решение. Заранее спасибо!

Обновление

Мой вопрос и состоит в том, чтобы узнать как получить все данные сразу. Я пробовал "слепить" все таблицы с помощью join:

select
`evals`.`pupil_id` `pupil_id`, 
`evals`.`lesson_id` `lesson_id`, 
`evals`.`eval` `eval`,
`evals`.`id` `eval_id`
from
`evals` `evals`
join
`lessons` `lessons`
on
`evals`.`lesson_id`=`lessons`.`id`
left join
`absent` `absent`
on 
`absent`.`pupil_id`=`evals`.`pupil_id`
where
`evals`.`subject_id`=10 and 
`lessons`.`date` between '1409515200' and '1420920000'

Ответы

▲ 2

Что-нибудь такое попробуйте:

select p.lastname, e.date, ifnull(a.lesson_id,e.eval) from pupils p
left join evals e on p.id=e.pupil_id
left join subjects s on e.subject_id=s.id
left join absent a on p.id=a.pupil_id
where s.id=?

Было бы удобно, если еще предварительные данные представили в таблицах. После получения ответа запроса есть возможность пихнуть обработку на каком-то ЯП?