Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > сложный запрос


Автор: del3d 14.6.2009, 13:32
Электронный журнал (с оценками).

Упрощенная версия:
Код

-- Таблица со студентами
CREATE TABLE `student`(
  `id` int auto_increment,
  `name` varchar(255),
  PRIMARY KEY(`id`)
);
-- Таблица с оценками
CREATE TABLE `mark`(
  `id` int auto_increment,
  `mark` int,
  `date_mark` date,
  `id_student` int,
  PRIMARY KEY(`id`)
);

Можно ли написать запрос, возвращающий примерно вот такую таблицу:
user posted image
т.е. чтобы оценки группировались по дате (в отдельном столбце)..  

Автор: Veve 14.6.2009, 13:38
Привет. Ну ты и объяснил:
Цитата

user posted image

Можешь словами описать, что тебе нужно, а ещё лучше небольшим примером. 

Автор: del3d 14.6.2009, 13:57
Нужно, чтобы оценки располагались как вв школьном журнале,
по столбцам, каждый столбец - это конкретная дата..

Автор: Veve 14.6.2009, 14:17
Ну тогда этот вопрос не сюда. Запрос будет обычным, к примеру таким: 
Код

SELECT mark, date_mark, name
FROM mark, student
WHERE mark.id_student=student.id
ORDER BY name, date_mark

Вопрос в том как ты будешь отображение делать.

Автор: del3d 14.6.2009, 21:15
Я так понял, нельзя на SQL такой запрос написать 
(чтобы поля в результате создавались по количеству различных дат.. в таблице с оценками)

Придется средствами языка программирования формировать такую таблицу, правильно?
Вопросов больше нет.. Спасибо..

Автор: Veve 14.6.2009, 21:20
По идее можно, но это мне кажется будет не совсем правильно и трудоёмко. Ну, подожди может кто ещё подскажет, что-нибудь дельное.
Ну я бы точно программно формировал бы. 

Автор: Zloxa 15.6.2009, 12:25
Задача, которую вы пытаетесь решить называется транспонирование.
Парадигма SQL - структура результата запроса заранее известна и не зависит от данных.
Ввиду этого такую операцию как транспонирование поддерживает очень малое количество диалектов, потому как количество столбцов(структура результата) при этой операции заведомо не известно.
Однако, если мы заранее знаем даты, на которые мы хотели бы иметь результат, мы таки можем составить запрос.
Код

  select student.name
            ,avg(case when date_mark = '12.04.09'  then mark.mark end) "12.04.09"
            ,avg(case when date_mark = '13.05.09'  then mark.mark end) "13.05.09"
            ,avg(case when date_mark = '20.05.09'  then mark.mark end) "20.05.09"
  from student,mark
  where student.id = mark.id_student
  group by student.id,student.name

Прошу прощения, я не знаю особенностей реализации SQL в MySql. Этот запрос вам самостоятельно придется доработать напильником.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)