Если бы все данные были в одной записи, можно было бы просто вывести сумму в 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), но в этом нет ничего страшного.
Заодно, если добавится новая группа, то вам не надо будет менять структуру таблицы.