Страницы

Поиск по вопросам

вторник, 7 мая 2019 г.

Ошибка при создании SQL запроса

При выполнении запроса выводится ошибка
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group, discipline, exam, student WHERE exam.stud_id = student.stud_id AND ' at line 2
Вот сам запрос:
SELECT group.index_group, discipline.name_disc, COUNT(*), SUM(value) FROM group, discipline, exam, student WHERE exam.stud_id = student.stud_id AND exam.disc_id = discipline.disc_id AND exam.value IS NOT NULL AND exam.value > 2 GROUP BY group.index_group, discipline.name_disc
Вот используемые таблицы:
CREATE TABLE IF NOT EXISTS `discipline` ( `disc_id` int(11) NOT NULL AUTO_INCREMENT, `name_disc` varchar(100) DEFAULT NULL, `type_of_classes` varchar(100) DEFAULT NULL, `id_prepod` int(11) NOT NULL, `index_group` int(11) NOT NULL, PRIMARY KEY (`disc_id`), KEY `index_group` (`index_group`), KEY `id_prepod` (`id_prepod`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
СREATE TABLE IF NOT EXISTS `exam` ( `id` int(11) NOT NULL AUTO_INCREMENT, `disc_id` int(11) NOT NULL, `stud_id` int(11) NOT NULL, `value` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `disc_id` (`disc_id`), KEY `stud_id` (`stud_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `group` ( `index_group` int(11) NOT NULL AUTO_INCREMENT, `course` int(11) NOT NULL, `id_specialization` int(11) NOT NULL, PRIMARY KEY (`index_group`), KEY `id_specialization` (`id_specialization`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `student` ( `stud_id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `index_group` int(11) NOT NULL, PRIMARY KEY (`stud_id`), KEY `index_group` (`index_group`), KEY `index_group_2` (`index_group`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Помогите, пожалуйста, с решением данной проблемы.


Ответ

Проблема в обращении к таблице group. В MySQL слово group - зарезервированное слово (является частью синтаксиса select ... group by), и если надо его использовать в качестве имени для базы/таблицы/столбца - обрамляйте его кавычками:
select `group` ... from `group`
То же касается зарезервированных слов select, insert, delete, update (они обозначают действия, которые можно выполнить со строками), text, date, time (они обозначают типы данных) и многих других
Общей практикой и хорошим тоном будет всегда обрамлять названия базы/таблицы/столбца в запросах кавычками, независимо от присутствия ключевых слов в этих названиях:
select `fldname` from `bdname`.`tblname` where `fld2name` = '123' order by `fld3name` limit 5

Комментариев нет:

Отправить комментарий