Как правильно обработать данные из mysql БД?

Доброе время суток. Просьба помочь с правильной организацией обработки данных.
Имеется таблица:
id int(11) NOT NULL AUTO_INCREMENT,
  disciplina varchar(255) DEFAULT NULL,
  nomer_gr varchar(255) DEFAULT NULL,
  sm1_to int(11) DEFAULT NULL,
  sm1_po1 int(11) DEFAULT NULL,
  sm1_po2 int(11) DEFAULT NULL,
  sm1_exz int(11) DEFAULT NULL,
  sm1_kp1 int(11) DEFAULT NULL,
  sm1_kp2 int(11) DEFAULT NULL,
  sm1_kp_pr int(11) DEFAULT NULL,
  sm2_to int(11) DEFAULT NULL,
  sm2_po1 int(11) DEFAULT NULL,
  sm2_po2 int(11) DEFAULT NULL,
  sm2_exz int(11) DEFAULT NULL,
  sm2_kp1 int(11) DEFAULT NULL,
  sm2_kp2 int(11) DEFAULT NULL,
  sm2_kp_pr int(11) DEFAULT NULL,
  consultacii int(11) DEFAULT NULL,
  rukovodstvo int(11) DEFAULT NULL,
  dp int(11) DEFAULT NULL,
  gak int(11) DEFAULT NULL,
  vsego_po_gr int(11) DEFAULT NULL,
  prazdn int(11) DEFAULT NULL,
  vakansiya int(11) DEFAULT NULL,
  id_prepodavatel int(11) DEFAULT NULL,
  PRIMARY KEY (id)

Записей в таблице ~1500
Цель: сделать запрос `SELECT * FROM full WHERE id_prepodavatel = 1` , после чего во всей выборке есть несколько одинаковых записей в столбце `disciplina`, их надо сложить (если одинаковые).

Вопрос: делать все через `php` или можно еще реализовать как то на уровне сервера mysql, в виде создания дополнительной таблицы?
Проблема в том что не знаю как вообще это реализовать. Просьба пнуть в нужную сторону))

Заранее спасибо.
  • Вопрос задан
  • 2375 просмотров
Решения вопроса 1
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
SELECT disciplina , SUM ( sm1_to ), SUM(sm1_po1 ), ... GROUP BY disciplina
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
lexxpavlov
@lexxpavlov
Программист, преподаватель
Если бы все данные были в одной записи, можно было бы просто вывести сумму в select:
SELECT sm1_to+sm1_po1+sm1_po2 AS `hours` FROM full WHERE id_prepodavatel = 1

Но у вас разные строки (я так понял, по одной колонке заполнены в каждой записи).
Тогда нужно добавить GROUP BY disciplina и указать sum(sm1_to)+sum(sm1_po1) и т.д.
Но основная проблема у вас не в этом - вам нужно переделать таблицу и не делать так много колонок. Каждый раз, когда у вас начинаются колонки со странными названиями, всегда возникает вопрос - а правильно ли спроектирована таблица?
Можно сделать что-то типа такого:
id int(11) NOT NULL AUTO_INCREMENT,
  disciplina varchar(255) DEFAULT NULL,
  nomer_gr varchar(255) DEFAULT NULL,
  type int(11) NOT NULL,
  hours int(11) NOT NULL DEFAULT 0,
  vakansiya int(11) DEFAULT NULL,
  id_prepodavatel int(11) DEFAULT NULL,
  PRIMARY KEY (id)

То есть разбить одну длинную запись на множество маленьких, у каждой из которых указан тип.
И тогда будет очень просто просуммировать через GROUP BY:
SELECT id_prepodavatel, disciplina, sum(hours) AS `hours` FROM full WHERE id_prepodavatel = 1 GROUP BY disciplina

Тип записи будет указывать, какие именно часы указаны в этой записи. Можно сделать числовым типом (как я указал выше), а можно сделать enum. В типе и будут все эти ваши sm1_to, sm1_po1, sm1_po2 и другие. Количество строк в таблице увеличится примерно в 20 раз (1500 * 20 = 30000), но в этом нет ничего страшного.
Заодно, если добавится новая группа, то вам не надо будет менять структуру таблицы.
Ответ написан
azrail_dev
@azrail_dev
Сложить 2 строки? Может CONCAT_WS?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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