Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Не могу оформить вывод...


Автор: NFL 7.12.2009, 19:09
Суть следующая. Есть таблица в БД MySQL. 
Структура такая:

id|predmet|predmet_id|surname|name|type_of_mark|klass|mark|teacher_who_posted|post_date

(таблица для школьного онлайн-дневника)

Описание полей:

id - айди записи, автоинкрементное
predmet - название предмета на русском (украинском)
predmet_id - идентификатор предмета, не важно зачем
surname - фамилия ученика
name - имя ученика
type_of_mark - тип оценки (контрольная/тематическая/текущая/... и тд)
klass - класс, в котором учится ученик
mark - оценка ученика по данному предмету (predmet)
teacher_who_posted - фамилия учителя
post_date - дата выставления оценки

Есть запрос:

Код

$sql='"SELECT * FROM `daybook` WHERE (`predmet_id`='$pred') AND (`klass`='$klass') AND (`post_date`>=NOW()-INTERVAL 7 DAY) ORDER BY `surname`")';
$marks=mysql_query ($sql);


Выбираем все оценки за неделю для определенного класса 
(переменные $klass/$pred передаются методом "раком", но это не важно, все работает smile )

Задача в следующем: нужно воспроизвести страницу классного журнала:

Фамилия, Имя    |дата1|дата2|дата3|дата4|...|
Фамилия1 Имя1     оц       оц        оц      оц
Фамилия2 имя2     оц       оц        оц      оц
ФамилияН ИмяН    оц       оц        оц      оц

(оц - оценка этого ученика за определенную дату, если ученика не было на уроке - будет введена оценка "0", если есть 0 - вывести в клетке значение "н", если оценки 0 нет, и вообще оценки нет, то вывести просто пустую клетку)

Не могу понять, как вывести такую таблицу? Кому не влом, помогите, а?

А то я скоро  smile с этим выводом(((

Автор: v00d00 7.12.2009, 19:54
То что вы хотите сделать называется перекрестный запрос.

Я могу ошибаться, но вроде MySQL не поддерживает встроенных механизмов для создания таких запросов.

Однако, вот пример по вашей теме http://en.wikibooks.org/wiki/MySQL/Pivot_table

И вот еще http://dev.mysql.com/tech-resources/articles/wizard/print_version.html

Добавлено через 13 минут и 46 секунд
Возможно в вашем случае сначала придется генерировать текст запроса средствами PHP чтобы вывести информацию для нужных дат


или, как вариант, написать хранимую процедуру с параметром (дата) и передавать в неё текущую дату

Автор: NFL 7.12.2009, 20:20
Тааак... Покурил мануал...

Код

mysql> select name,
sum(score*(1-abs(sign(exam-1)))) as exam1,
sum(score*(1-abs(sign(exam-2)))) as exam2,
sum(score*(1-abs(sign(exam-3)))) as exam3,
sum(score*(1-abs(sign(exam-4)))) as exam4


Ну в принципе очень похоже...
Здесь мы выбираем имя, это понятно... 1-abs(), это тоже понятно.... Но что такое sign(exam-1)?



Автор: NFL 8.12.2009, 22:43
Практически написал. осталась одна заморочка...

Код

$res=mysql_query("SELECT * FROM `daybook` WHERE (`predmet_id`='$pred') AND (`klass`='$klass') AND (`post_date`>=NOW()-INTERVAL 7 DAY) ORDER BY `surname`");
$arr=array();
while($_r=mysql_fetch_assoc($res)){
    $arr[$_r['surname'].":".$_r['name']][]=$_r['mark'];
}

echo "<table border=1px>";
echo "<tr><td>Surname</td><td>Name</td>".str_repeat("<td>X</td>",sizeof($arr[key($arr)]))."</tr>";
echo "<tr>";
foreach($arr as $k=>$v){
    //echo str_repeat("<td>X</td>",sizeof($v));
    echo "<tr>";
    $n=split(':',$k);
    echo "<td>".$n[0]."</td><td>".$n[1]."</td>";
    foreach($v as $m){
   //echo "<td>".(($m==0)?"н":$m)."</td>";
   echo "<td>".(($m==0)?"н":(intval($m)!=-1)?$m :"")."</td>";

    }
    echo "</tr>";
}
echo "</table>";


последний вопрос:

как вместо echo str_repeat("<td>X</td>",sizeof($v)); выводить соответствующую дату? ее тоже закидывать в массив $arr и потом в foreach впихивать?

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