Допустил ошибку в структуре таблицы. Как исправить?

Есть InnoDB таблица, в которой хранится успеваемость учеников.
Структура таблицы
CREATE TABLE `performance` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pupil_id` int(11) NOT NULL,
  `date` date NOT NULL,
  `read` tinyint(4) NOT NULL,
  `write` tinyint(4) NOT NULL,
  `listening` tinyint(4) NOT NULL,
  `translate` tinyint(4) NOT NULL,
  `late` tinyint(1) NOT NULL,
  `nothw` tinyint(1) NOT NULL,
  `skip` tinyint(1) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Там где оценивание не проводилось ставится 0. В последствии эти данные используются для построение графика успеваемости. Естественно что брать нулевое значение для отображения на графике не нужно. График строится в соответствии с значениями, которые хранятся в полях read, write, listening, translate — по оси У. По оси Х — отображается дата.
Чтобы получить значения успеваемости по каждому виду деятельности без учета нулей, придется делать SELECT для каждого столбца. Запрос получается такого вида:
SELECT performance.date, performance.read FROM performance WHERE performance.read <> 0;

Такие же запросы для остальных столбцов.
Пример таблицы, столбцы в порядке немного не совпадают:
id date pup_id read write listening translate skip late nothw
1 01.02.2013 7 10 10 0 4 0 0 0
2 02.02.2013 7 8 11 4 4 0 0 0
3 03.02.2013 7 0 0 0 0 1 0 0

Как исправить структуру, чтобы можно было одноим запросом получить данные?
  • Вопрос задан
  • 3388 просмотров
Пригласить эксперта
Ответы на вопрос 5
Stdit
@Stdit
Создайте отношение в таком виде: [id, dt, pupil_id, disc_id, value]. Для каждого ученика и предмета на нужную дату ставится оценка. Потом получаете все необходимые данные и рисуете по ним график. Другой плюс такой формы хранения в том, что сможете построить общий график успеваемости по дисциплине без учёта учеников, и другие аналитические запросы.
Ответ написан
King_Of_Magic
@King_Of_Magic
Не очень понял что мешает через AND дописать условия в WHERE? Поясните, может быть я неверно понял задачу?
Ответ написан
docomo
@docomo
А обработку и вычищение данных перед тем, как отдать их в график, сделать разве не вариант? Даже если бы у вас там был NULL или любое другое значение — одним запросом вы бы не обошлись.
В четырех простых запросах нет ничего плохого. Индексы расставьте.
Либо разнесите данные на две таблицы, но придется написать скрипт миграции.
Ответ написан
@WEBIVAN
Почему бы просто не получать все данные и просто не прорисовывать даты с нулями на уровне програмной логики?
Вы сами хотя бы преставляете в каком виде хотите получить результирующую таблицу?
Ответ написан
@softm
Сделать временную таблицу (CREATE TEMPORARY TABLE), занести туда несколько раз внести данные INSERT (...) SELECT… WHERE>0, после чего сделать SELECT… GROUP BY.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы