Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу оформить вывод... Знаю что элементарно, но туплю... 
:(
    Опции темы
NFL
  Дата 7.12.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 5.5.2009

Репутация: нет
Всего: нет



Суть следующая. Есть таблица в БД 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 с этим выводом(((
PM MAIL   Вверх
v00d00
Дата 7.12.2009, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 28.12.2005

Репутация: нет
Всего: нет



То что вы хотите сделать называется перекрестный запрос.

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

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

И вот еще http://dev.mysql.com/tech-resources/articl...nt_version.html

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


или, как вариант, написать хранимую процедуру с параметром (дата) и передавать в неё текущую дату
PM MAIL   Вверх
NFL
Дата 7.12.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 5.5.2009

Репутация: нет
Всего: нет



Тааак... Покурил мануал...

Код

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)?



PM MAIL   Вверх
NFL
Дата 8.12.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 5.5.2009

Репутация: нет
Всего: нет



Практически написал. осталась одна заморочка...

Код

$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 впихивать?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1143 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.