Задавайте вопросы, мы ответим
Вы не зашли.
Есть две таблицы:
http://s019.radikal.ru/i601/1302/20/60bf9912c1d1.jpg
и
http://s017.radikal.ru/i442/1302/de/3a244e8c2fe8.jpg
Нужно: Написать запрос, который выдает список фамилий студентов, с комментарием 'успевает' у студентов, имеющих все положительные оценки, комментарием 'не успевает' для имеющих хотя бы одну неудовлетворительную оценку и комментарием 'не сдавал' — для всех остальных. В выводимом результате фамилии студентов упорядочить по алфавиту.
У меня получилось примерно следующее:
Неактивен
Возникло несколько вопросов:
1) Что значит "далёк от совершенства"? Чем результат не устроил?
2) Нужно ли выводить в итоговом списке тех студентов, у которых нет ни одной оценки ни по одному предмету?
3) В таблице с оценками, Вами приведенной, в одной записи оценка отсутствовала ( где exam_id = 639). Это что означает - неуд? неявка? То есть непонятно, считать ли это неудовлетворительной оценкой,
И приведите пожалуйста
структуру Ваших таблиц и данные в формате show create table `student` и show create table `exam_marks`,
данные в виде insert into.. (можно просто тестовый набор) и
результ, который Вы хотите получить.
Неактивен
1) В результате мне выдает список только тех студентов, что есть в `exam_marks`,
а комментарии, как я понял, присваиваются исходя только из большей оценки( например, у студента оценки 2 и 5, комментарий будет "успевает" хотя должен быть "не успевает")
2) Да, это и есть те кто "не сдавал"
3) Это означает изначально идиотские таблицы данные преподавателем, можно это просто проигнорировать
Неактивен
В-общем, вид монстрооборазный, конечно, но работает вроде - проверяйте.
mysql> SELECT -> SURNAME, -> CASE -> WHEN (SELECT count(*) from t_6493_EXAM_MARKS WHERE STUDENT_ID = s.STUDENT_ID) = 0 THEN -> 'НЕ СДАВАЛ' -> ELSE -> CASE -> WHEN (SELECT count(*) from t_6493_EXAM_MARKS WHERE STUDENT_ID = s.STUDENT_ID AND MARK <= 2) > 0 THEN -> 'НЕ УСПЕВАЕТ' -> ELSE -> 'УСПЕВАЕТ' -> END -> END as commentary -> FROM -> t_6493_STUDENT s; +---------+-----------------------+ | SURNAME | commentary | +---------+-----------------------+ | Ivanov | НЕ УСПЕВАЕТ | | Petrov | УСПЕВАЕТ | | Sidorov | НЕ СДАВАЛ | +---------+-----------------------+ 3 rows in set (0.00 sec)
Иванов сдал математику на три, физику на два - не успевает
Петров отличник - сдал и математику и физику на 5 - успевает.
Сидоров ни разу не пришёл, ничего не сдавал - не сдавал.
Неактивен
Спасибо, все работает, только второй CASE по сути не нужен, то есть:
Неактивен
Насчет второго case'a - это уже скорее вопрос "дизайна" запроса, мне мой вариант кажется более читабельным .
Что касается count(STUDENT_ID) - поскольку STUDENT_ID не должно быть равно NULL ( хоть в Вашей структуре и не указано, что NOT NULL - но строка с нулевым student_id не имеет смысла, ведь оценка должна быть кому-то поставлена! ), то особой разницы нет.
Неактивен
Снова, здравствуйте
Можете еще помочь переписать
Неактивен
Не уверен, что такой запрос хорошо переписывается без вложенных селектов. Да и зачем?
Неактивен
deadka, прихоть преподавателя)
Неактивен
Экий прихотливый
mysql> SELECT -> s.STUDENT_ID, -> s.SURNAME, -> CASE -> WHEN ( max( coalesce(MARK,0) )=0 ) THEN -> 'НЕ СДАВАЛ' -> ELSE -> CASE -> WHEN max(CASE WHEN MARK<3 THEN 1 ELSE 0 END) THEN -> 'НЕ УСПЕВАЕТ' -> ELSE -> 'УСПЕВАЕТ' -> END -> END as `result` -> from t_6493_STUDENT s LEFT JOIN t_6493_EXAM_MARKS using(STUDENT_ID) group by s.STUDENT_ID; +------------+---------+-----------------------+ | STUDENT_ID | SURNAME | result | +------------+---------+-----------------------+ | 1 | Ivanov | НЕ УСПЕВАЕТ | | 2 | Petrov | УСПЕВАЕТ | | 3 | Sidorov | НЕ СДАВАЛ | +------------+---------+-----------------------+ 3 rows in set (0.00 sec)
Неактивен
Спасибо, выручаете меня
Неактивен