[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: история
uMnepaTop
добрый день. у меня возник вопрос. что-то в голове крутится, но не понять никак..
скажите пожалуйста, какие таблицы надо саоздать для "истории(графиков) по часам, дням, месяцам"?

например по часам:
время - кол-во(разное) - pid (много)
00:00 - 24 - 1
02:00 - 11 - 1
04:00 - 1 - 1
и до конца дня

все это дело записывать в таблицу, для вывода в график..

вот сообразить никак не могу :unsure:
буду благодарен за любую помощь!!

я предполагаю надо создать (по часам):
id, pid, time_0, time_2, time_4, time_6, time_8, time_10, time_12, time_14, time_16, time_18, time_20, time_22

и в зависимости от реального времени, записывать в time_n, кол-во..

потом, для записи в таблицу (январь, февраль, март) по дням, что-то как-то суммировать и записать
id, pid, chislo_1, chislo_2 и т.д


так же и с годом....



Спустя 28 минут, 19 секунд (15.02.2011 - 16:04) sergeiss написал(а):
Если я тебя правильно понял, то тебе надо создать 2 поля: дата (тип "дата") и час дня (тип "целое") - либо дата ("дата") и время("время"). Плюс информационные поля и какой-то идентификатор объекта.
Тогда ты потом сможешь выбрать всё, что угодно. Как почасовые данные, так и суммарные.

Кстати говоря... Если у тебя будут еще и суммарные суточные данные, то рекомендую создать отдельную строку с данными за 25-й час, т.е. с суммой за 24 часа. Это для одного, единичного объекта.
А сумму по дням и месяцам будешь находить потом уже, во время выборки. Либо - можешь создать и сумму за месяц по единичным объектам.

Спустя 6 минут, 8 секунд (15.02.2011 - 16:10) Michael написал(а):
Ну твоя структура мне совсем не нравится.

Определись сначала что у тебя за атомарная единица информации(событие) и какие у него характеристики.
Например продажи и нужно учитывать почасово выручку.
Сущность твоя - сумма продажи в некий час. Идентифицируется однозначным периодом и суммой.
Вот структура таблицы:
id summ year month hour


hour - число от 1 до 23 например.

И смотри насколько удобно тебе будет из такой БД выбирать данные, добавлять и т.д.

Спустя 4 минуты, 23 секунды (15.02.2011 - 16:15) sergeiss написал(а):
Michael
Год-месяц-день должны быть в одном поле типа "дата", иначе делать выборку за произвольный диапазон дат будет просто нереально!!!

Спустя 4 минуты, 25 секунд (15.02.2011 - 16:19) Michael написал(а):
та то я схематически, даже день забыл.
А почему нереально - в запросе переводишь в дни и вперед smile.gif

Спустя 18 секунд (15.02.2011 - 16:19) uMnepaTop написал(а):
Цитата (sergeiss @ 15.02.2011 - 16:04)
Если я тебя правильно понял, то тебе надо создать 2 поля: дата (тип "дата") и час дня (тип "целое") - либо дата ("дата") и время("время"). Плюс информационные поля и какой-то идентификатор объекта.
Тогда ты потом сможешь выбрать всё, что угодно. Как почасовые данные, так и суммарные.

Кстати говоря... Если у тебя будут еще и суммарные суточные данные, то рекомендую создать отдельную строку с данными за 25-й час, т.е. с суммой за 24 часа. Это для одного, единичного объекта.
А сумму по дням и месяцам будешь находить потом уже, во время выборки. Либо - можешь создать и сумму за месяц по единичным объектам.

т.е получается "25-й час" - столбец суммированый за 24 часа?
и как лучше добавлять информацию в БД в зависимости от времени?
if else? или interval? или еще как?

Спустя 9 минут, 23 секунды (15.02.2011 - 16:29) sergeiss написал(а):
Цитата (uMnepaTop @ 15.02.2011 - 17:19)
т.е получается "25-й час" - столбец суммированый за 24 часа?

Какой, блин, столбец??? СТРОКА!!!! Один объект за один час - одна строка (24 строки за сутки). Один объект за сутки - еще одна, другая строка, 25-я (если нужна сразу сумма за день). Об этом и я говорю, и Майкл.

Цитата (Michael @ 15.02.2011 - 17:19)
А почему нереально - в запросе переводишь в дни и вперед

ОК smile.gif Тока куда их "переводить"? Пример - в студию! wink.gif

Спустя 6 минут, 31 секунда (15.02.2011 - 16:35) Michael написал(а):
Цитата (sergeiss)
ОК smile.gif Тока куда их "переводить"? Пример - в студию! wink.gif


тут проскальзывало

Я сам не большой сторонник такого решения. Это больше те кто помешан на переносимости базы и запросов. Например в mysql чтобы месяц выцепить в типе дата-время в запросе надо использовать функцию MONTH(). В постгре - имеется?

Спустя 36 минут, 15 секунд (15.02.2011 - 17:12) sergeiss написал(а):
Цитата (Michael @ 15.02.2011 - 17:35)
Например в mysql чтобы месяц выцепить в типе дата-время в запросе надо использовать функцию MONTH(). В постгре - имеется?

Ну дык, спрашиваешь! :) Конечно есть.

date_ - поле типа date
select date_part( 'month', date_) as month, ...



Цитата (Michael @ 15.02.2011 - 17:35)
Это больше те кто помешан на переносимости базы и запросов.

"К терапевту"... Я считаю, что надо использовать по максимуму все возможности каждого типа БД.

Спустя 2 минуты, 55 секунд (15.02.2011 - 17:15) Michael написал(а):
sergeiss, та то что в принципе есть то понятно ... но синтаксис другой. А значит нужно лезть в запросы переписывать. Я же спрашивал о наличии именно функции MONTH().

Спустя 10 минут, 8 секунд (15.02.2011 - 17:25) sergeiss написал(а):
Ты знаешь... Если уж очень нужна функция MONTH(), то написать её - дело на 5 минут smile.gif И будет она возвращать как раз "date_part( 'month', ... )" от переданного аргумента smile.gif

Но в любом случае я считаю, что не надо бездумно переписывать запросы при переходе из одно БД в другую. Потому что это просто не реально и бессмысленно. Именно потому, что у каждой БД может быть своя специфика, положительная по сравнению с другими БД.

Например. Вот только отдельные различия.
В MySQL есть INSERT ... ON DUPLICATE KEY UPDATE..., а в Постгре нету.
Но зато в Постгре есть другие плюсы smile.gif В частности, "на вскидку", в запросе UPDATE, INSERT или DELETE я могу написать RETURNING * (или список нужных мне полей) и сразу же, БЕЗ ДОПОЛНИТЕЛЬНЫХ ТЕЛОДВИЖЕНИЙ, получить обновленные, вставленные или удаленные данные. Такого в MySQL нет.

И вот попробуй перепиши запросы с такой спецификой из одной БД в другую (я уж не говорю о том, чтобы просто "в лоб" использовать), чтобы они работали в обеих БД. Сделаешь? Нет. Поэтому и не надо делать универсальные запросы.

Спустя 12 часов, 54 минуты, 47 секунд (16.02.2011 - 06:19) uMnepaTop написал(а):
Вот не поверите.. С таблицей разобрался вроде как, а вот график никак не могу сделать, часов этак 8 сижу и дуплюсь........... :ph34r:

CREATE TABLE IF NOT EXISTS `sh_hours` (
`id` int(11) NOT NULL auto_increment,
`srv_id` int(11) NOT NULL,
`date` date NOT NULL,
`time` int(2) NOT NULL,
`players` int(11) NOT NULL,
`max_players` int(11) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=49 ;

--
-- Дамп данных таблицы `sh_hours`
--

INSERT INTO `sh_hours` (`id`, `srv_id`, `date`, `time`, `players`, `max_players`) VALUES
(11, 1, '2011-02-16', 10, 3, 33),
(2, 1, '2011-02-15', 1, 7, 33),
(3, 1, '2011-02-15', 2, 11, 33),
(4, 1, '2011-02-15', 3, 3, 33),
(5, 1, '2011-02-15', 4, 0, 33),
(6, 1, '2011-02-15', 5, 31, 33),
(7, 1, '2011-02-15', 6, 31, 33),
(8, 1, '2011-02-15', 7, 24, 33),
(9, 1, '2011-02-15', 8, 16, 33),
(10, 1, '2011-02-15', 9, 5, 33),
(12, 1, '2011-02-15', 11, 0, 33),
(13, 1, '2011-02-15', 12, 0, 33),
(14, 1, '2011-02-15', 13, 0, 33),
(15, 1, '2011-02-15', 14, 0, 33),
(16, 1, '2011-02-15', 15, 0, 33),
(17, 1, '2011-02-15', 16, 5, 33),
(18, 1, '2011-02-15', 17, 5, 33),
(19, 1, '2011-02-15', 19, 7, 33),
(20, 1, '2011-02-15', 18, 9, 33),
(21, 1, '2011-02-15', 20, 1, 33),
(22, 1, '2011-02-15', 21, 11, 33),
(23, 1, '2011-02-15', 22, 17, 33),
(24, 1, '2011-02-15', 23, 21, 33),
(1, 1, '2011-02-15', 0, 1, 33),
(25, 2, '2011-02-16', 10, 5, 27),
(26, 2, '2011-02-15', 1, 9, 27),
(27, 2, '2011-02-15', 2, 1, 27),
(28, 2, '2011-02-15', 3, 3, 27),
(29, 2, '2011-02-15', 4, 5, 27),
(30, 2, '2011-02-15', 5, 6, 27),
(31, 2, '2011-02-15', 6, 5, 27),
(32, 2, '2011-02-15', 7, 11, 27),
(33, 2, '2011-02-15', 8, 18, 27),
(34, 2, '2011-02-15', 9, 16, 27),
(35, 2, '2011-02-15', 11, 10, 27),
(36, 2, '2011-02-15', 12, 1, 27),
(37, 2, '2011-02-15', 13, 0, 27),
(38, 2, '2011-02-15', 14, 0, 27),
(39, 2, '2011-02-15', 15, 0, 27),
(40, 2, '2011-02-15', 16, 10, 27),
(41, 2, '2011-02-15', 17, 24, 27),
(42, 2, '2011-02-15', 19, 27, 27),
(43, 2, '2011-02-15', 18, 26, 27),
(44, 2, '2011-02-15', 20, 26, 27),
(45, 2, '2011-02-15', 21, 25, 27),
(46, 2, '2011-02-15', 22, 12, 27),
(47, 2, '2011-02-15', 23, 14, 27),
(48, 2, '2011-02-15', 0, 15, 27);

помогите пожалуйста.... апи гугла мучал! мучал еще всякие разные апи.. ничего не получается(((

Спустя 4 часа, 10 минут, 6 секунд (16.02.2011 - 10:30) sergeiss написал(а):
Для построения графика тебе нужно GD2 использовать из ПХП.

Спустя 4 часа, 48 минут, 43 секунды (16.02.2011 - 15:18) uMnepaTop написал(а):
ну так это понятно, только я не пойму, как сделать выборку по часам, чтобы при определенном времени, показывало определенное кол-во players на оси

вот есть например:

$query = mysql_query("SELECT * FROM `sh_hours` WHERE `srv_id` = '{$_GET['id']}'");
$row = mysql_fetch_assoc($query);

for($i=0; $i <= $row['max_players']; $i++)
{
$line_y[] = $i;
}

// max оси Y
print_r($line_y);
// max оси Х
print_r(array('00:00','01:00','02:00','03:00','04:00','05:00','06:00','07:00','08:00','09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00','19:00','20:00','21:00','22:00','23:00'));


Спустя 22 минуты, 40 секунд (16.02.2011 - 15:41) sergeiss написал(а):
Так в чем проблема-то... Сделать правильную выборку из БД или построить график по известным данным?

Спустя 5 минут, 27 секунд (16.02.2011 - 15:46) uMnepaTop написал(а):
получается одно из другого вытекает, потому, что я не могу сделать правильную выборку, вследствии не получается сделать график... может график правильно делал, но выборка была неправильная...

Спустя 12 минут, 46 секунд (16.02.2011 - 15:59) uMnepaTop написал(а):
не могу понять, как сделать выборку, чтобы date("G"); <=$row['time'];

Спустя 20 минут, 9 секунд (16.02.2011 - 16:19) sergeiss написал(а):
Цитата (uMnepaTop @ 16.02.2011 - 16:59)
не могу понять, как сделать выборку, чтобы date("G"); <=$row['time'];

А на словах это если описать, то как будет?

Спустя 1 час, 5 минут, 38 секунд (16.02.2011 - 17:25) uMnepaTop написал(а):
В общем я уже нихрена не понимаю и объяснить нифига не могу.......((
вот что примерно должно получится, но не получается:

Спустя 37 минут, 7 секунд (16.02.2011 - 18:02) sergeiss написал(а):
uMnepaTop - так что ты делаешь-то????? Твой код на предыдущей странице - полная абстракция.

Спустя 2 часа, 14 минут, 17 секунд (16.02.2011 - 20:16) uMnepaTop написал(а):
Цитата (sergeiss @ 16.02.2011 - 18:02)
uMnepaTop - так что ты делаешь-то????? Твой код на предыдущей странице - полная абстракция.

ну вот например:
$config['server'] = "localhost";
$config['user'] = "root";
$config['pass'] = "vertrigo";
$config['db'] = "graph";

$database = mysql_connect($config['server'], $config['user'], $config['pass']);
$select_db = mysql_select_db($config['db'], $database);

$date = date("H");

$query = mysql_query("SELECT * FROM `sh_hours` WHERE `srv_id` = '{$_GET['id']}' AND `time` < '{$date}'");
while ($row = mysql_fetch_assoc($query))
{

$DATA=Array();
for ($i=0; $i<$date; $i++)
{
$DATA[0][]=$row['max_players'];
$DATA["x"][]=$i;
}

// Задаем изменяемые значения #######################################

// Размер изображения


$W=500;
$H=200;

// Отступы
$MB=20; // Нижний
$ML=8; // Левый
$M=5; // Верхний и правый отступы.
// Они меньше, так как там нет текста

// Ширина одного символа

$LW=imagefontwidth(2);

// Подсчитаем количество элементов (точек) на графике
$count=count($DATA[0]);

if ($count==0) $count=1;

// Сглаживаем графики ###############################################
if ($_GET["smooth"]==1) {

// Добавим по две точки справа и слева от графиков. Значения в
// этих точках примем равными крайним. Например, точка если
// y[0]=16 и y[n]=17, то y[1]=16 и y[-2]=16 и y[n+1]=17 и y[n+2]=17

// Такое добавление точек необходимо для сглаживания точек
// в краях графика


for ($j=0;$j<3;$j++) {
$DATA[$j][-1]=$DATA[$j][-2]=$DATA[$j][0];
$DATA[$j][$count]=$DATA[$j][$count+1]=$DATA[$j][$count-1];
}

// Сглаживание графики методом усреднения соседних значений

for ($i=0;$i<$count;$i++) {
for ($j=0;$j<3;$j++) {
$DATA[$j][$i]=($DATA[$j][$i-1]+$DATA[$j][$i-2]+
$DATA[$j][$i]+$DATA[$j][$i+1]+
$DATA[$j][$i+2])/5;
}
}
}



// Подсчитаем максимальное значение
$max=$row['max_players'];

for ($i=0;$i<$count;$i++) {
$max=$max<$DATA[0][$i]?$DATA[0][$i]:$max;
$max=$max<$DATA[1][$i]?$DATA[1][$i]:$max;
$max=$max<$DATA[2][$i]?$DATA[2][$i]:$max;
}

// Увеличим максимальное значение на 10% (для того, чтобы столбик
// соответствующий максимальному значение не упирался в в границу
// графика

$max=intval($max+($max/50));

// Количество подписей и горизонтальных линий
// сетки по оси Y.

$county=$row['max_players']/3;

// Работа с изображением ############################################

// Создадим изображение

$im=imagecreate($W,$H);

// Цвет фона (белый)
$bg[0]=imagecolorallocate($im,255,255,255);

// Цвет задней грани графика (светло-серый)
$bg[1]=imagecolorallocate($im,231,231,231);

// Цвет левой грани графика (серый)
$bg[2]=imagecolorallocate($im,212,212,212);

// Цвет сетки (серый, темнее)
$c=imagecolorallocate($im,184,184,184);

// Цвет текста (темно-серый)
$text=imagecolorallocate($im,136,136,136);

// Цвета для линий графиков
$bar[2]=imagecolorallocate($im,191,65,170);
$bar[0]=imagecolorallocate($im,161,155,0);
$bar[1]=imagecolorallocate($im,65,170,191);

$text_width=0;
// Вывод подписей по оси Y
for ($i=1;$i<=$county;$i++) {
$strl=strlen(($max/$county)*$i)*$LW;
if ($strl>$text_width) $text_width=$strl;
}

// Подравняем левую границу с учетом ширины подписей по оси Y
$ML+=$text_width;

// Посчитаем реальные размеры графика (за вычетом подписей и
// отступов)

$RW=$W-$ML-$M;
$RH=$H-$MB-$M;

// Посчитаем координаты нуля
$X0=$ML;
$Y0=$H-$MB;

$step=$RH/$county;

// Вывод главной рамки графика
imagefilledrectangle($im, $X0, $Y0-$RH, $X0+$RW, $Y0, $bg[1]);
imagerectangle($im, $X0, $Y0, $X0+$RW, $Y0-$RH, $c);

// Вывод сетки по оси Y
for ($i=1;$i<=$county;$i++) {
$y=$Y0-$step*$i;
imageline($im,$X0,$y,$X0+$RW,$y,$c);
imageline($im,$X0,$y,$X0-($ML-$text_width)/4,$y,$text);
}

// Вывод сетки по оси X
// Вывод изменяемой сетки

for ($i=0;$i<$count;$i++) {
imageline($im,$X0+$i*($RW/$count),$Y0,$X0+$i*($RW/$count),$Y0,$c);
imageline($im,$X0+$i*($RW/$count),$Y0,$X0+$i*($RW/$count),$Y0-$RH,$c);
}

// Вывод линий графика
$dx=($RW/$count)/2;

$pi=$Y0-($RH/$max*$DATA[0][0]);
$po=$Y0-($RH/$max*$DATA[1][0]);
$pu=$Y0-($RH/$max*$DATA[2][0]);
$px=intval($X0+$dx);

for ($i=1;$i<$count;$i++) {
$x=intval($X0+$i*($RW/$count)+$dx);

$y=$Y0-($RH/$max*$DATA[0][$i]);
imageline($im,$px,$pi,$x,$y,$bar[0]);
$pi=$y;

$y=$Y0-($RH/$max*$DATA[1][$i]);
imageline($im,$px,$po,$x,$y,$bar[1]);
$po=$y;

$y=$Y0-($RH/$max*$DATA[2][$i]);
imageline($im,$px,$pu,$x,$y,$bar[2]);
$pu=$y;
$px=$x;
}

// Уменьшение и пересчет координат
$ML-=$text_width;

// Вывод подписей по оси Y
for ($i=1;$i<=$county;$i++) {
$str=($max/$county)*$i;
imagestring($im,2, $X0-strlen($str)*$LW-$ML/4-2,$Y0-$step*$i-
imagefontheight(2)/2,$str,$text);
}

// Вывод подписей по оси X
$prev=100000;
$twidth=$LW*strlen($DATA["x"][0])+6;
$i=$X0+$RW;

while ($i>$X0) {
if ($prev-$twidth>$i) {
$drawx=$i-($RW/$count)/2;
if ($drawx>$X0) {
$str=$DATA["x"][round(($i-$X0)/($RW/$count))-1];
imageline($im,$drawx,$Y0,$i-($RW/$count)/2,$Y0+5,$text);
imagestring($im,2, $drawx-(strlen($str)*$LW)/2, $Y0+7,$str,$text);
}
$prev=$i;
}
$i-=$RW/$count;
}

header("Content-Type: image/png");

// Генерация изображения
ImagePNG($im);

imagedestroy($im);
}

Из документации.. Вот я не понимаю, как пусть линию "players", в зависимости от времени..

Спустя 41 минута, 28 секунд (16.02.2011 - 20:58) sergeiss написал(а):
Цитата (uMnepaTop @ 16.02.2011 - 21:16)
Вот я не понимаю, как пусть линию "players", в зависимости от времени..

Вот этот вопрос не понял.
И еще не понял - у тебя на картинке прямые линии, а должны быть "ломаные"?

И еще. У тебя тут в живом виде заложена возможность SQL-инъекции, когда ты используешь $_GET['id'] прямо в запросе.

Спустя 2 минуты, 31 секунда (16.02.2011 - 21:00) uMnepaTop написал(а):
гет это для теста просто.
Цитата
Вот я не понимаю, как пусть линию "players", в зависимости от времени..

не понимаю, как пусть кривую линию.. цифру (players) в зависимости от time (часов)
надо точку по Х поставить в зависимости от time

Спустя 30 минут, 57 секунд (16.02.2011 - 21:31) sergeiss написал(а):
Цитата (uMnepaTop @ 16.02.2011 - 22:00)
не понимаю, как пусть кривую линию.. цифру (players) в зависимости от time (часов)
надо точку по Х поставить в зависимости от time

Вот чё хошь делай... Так я и не понял самого главного.

То ли ты хочешь, чтобы твой график периодически менялся, например раз в час. То ли просто не понимаешь, как его пострить (хотя твой скрипт смотрится очень неплохо - но во все тонкости его работы я не вникал)?

Спустя 1 день, 20 часов, 1 минута, 22 секунды (18.02.2011 - 17:33) Guest написал(а):
Вроде разобрался.. И с API Google тоже.
Теперь немного другой вопросец. Как сделать "недельную" историю?
А точнее, как сделать выборку по последним 7 дням?

Спустя 42 секунды (18.02.2011 - 17:33) uMnepaTop написал(а):
Забыл авторизоваться... dry.gif
Только еще не разобрался, как суммировать "часовые" и вписать в "дневную (недельную)" таблицу :\

Спустя 2 часа, 56 минут, 41 секунда (18.02.2011 - 20:30) sergeiss написал(а):
Цитата (uMnepaTop @ 18.02.2011 - 18:33)
Только еще не разобрался, как суммировать "часовые" и вписать в "дневную (недельную)" таблицу

Построение графика будет принципиально такое же.

А при выборке данных используй GROUP BY так, чтобы как раз суммировать за день или неделю. Подумай сам для начала.

Спустя 1 час, 24 минуты, 15 секунд (18.02.2011 - 21:54) uMnepaTop написал(а):
Ну вот например:
SELECT AVG(players) as `summa` FROM `sh_hours` WHERE `date` >= subdate(curdate(), interval 1 day)

За сутки. За 7 дней так же конечно :)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.