![]() |
|
Задавайте вопросы, мы ответим
Вы не зашли.
Есть две таблицы:
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)Неактивен
Спасибо, выручаете меня
Неактивен