|
|
|
|
|
для: Valick
(11.03.2012 в 23:38)
| | Извиняюсь, что вовремя не ответил, код ваш обязательно изучу, просто то что я написал, по заданию нужно только 1 раз,и благо работает отменно, ваш код изучу, так как опыт всегда нужно набирать. А писать дополнительно действительно ничего не нужно потому что все уже и так есть.
С уважением к вам и вашему труду HK416 !!! | |
|
|
|
|
|
|
|
для: hk416
(10.03.2012 в 12:25)
| | вариант предложенный мной выше я отправил в "долгий ящик"
придумал другой вариант и вот что получилось
<?php
// устанавливаем переменные
$p=7; // интервал
$r="minute"; // размерность
$date = date_create('2011-12-01 00:00:00'); // дата начала периода
$stop = date_create('2011-12-01 00:29:00'); // дата конца периода
// подключение к базе данных
include('connect.php');
// создаем временную таблицу в оперативной памяти
$query="CREATE TEMPORARY TABLE
`shcala` (
`s_shcala` TIMESTAMP NOT NULL
)ENGINE = MEMORY";
$res=mysql_query($query) or die(mysql_error());
// заполняем временную таблицу данными (шкала выборки)
do{
$query="INSERT INTO `shcala` (s_shcala) VALUES('{$date->format('Y-m-d H:i:s')}')";
$res=mysql_query($query) or die(mysql_error());
date_add($date, date_interval_create_from_date_string($p.$r));
} while($date <= $stop);
$query="SELECT COUNT(v.reg_date) c, v.s_shcala s, v.s_shcala + INTERVAL $p-1 $r n
FROM
(SELECT *
FROM `shcala`
LEFT JOIN `regs`
ON s_shcala <= reg_date AND reg_date < s_shcala + INTERVAL $p $r) v
GROUP BY v.s_shcala";
$res=mysql_query($query) or die(mysql_error());
if($res){
if(mysql_num_rows($res)>0){
while($a=mysql_fetch_assoc($res)){
if($a[n]>$stop->format('Y-m-d H:i:s')) $a[n]=$stop->format('Y-m-d H:i:s');
echo $a[s]." - ".$a[n]." количество за данный отрезок времени ".$a[c]."<br />";
}
}else{
echo "База данных не содержит записи в указанный промежуток времени.<br />";
}
}else{
echo "Ошибка выполнения запроса к базе данных: ".mysql_error()."<br />";
}
?>
|
пробуйте, тестируйте
а то набивать толстую базу, для выборки например за 5 лет, с периодом в 3 месяца сил уже нет
можно еще добавить ограничения на диапазон выборки, что бы нельзя было указать диапазон больше чем реальный в БД, и на размерность, чтобы нельзя было указать допустим выборку за 10 лет, c периодичностью в одну секунду, а то хостер огорчит :)
___
надеюсь вы не ушли с форума в поисках форума покруче :)
а то получится зря старался :)
задача достаточно узконаправлена, вряд ли кому кроме вас понадобится
___
эх... видать зря, тогда и логику заполнения временной таблицы нет смысла дорабатывать :( | |
|
|
|
|
|
|
|
для: hk416
(10.03.2012 в 12:25)
| | нет именно по серверам у меня книг нет.
а по поводу кода, осталось доработать вывод, чтобы связать промежутки со значениями из базы | |
|
|
|
|
|
|
|
для: Valick
(10.03.2012 в 01:27)
| | Окей, и код изучим и на Шарлиз Терон в который раз посмотрим ))) Я спросить у вас хотел, а есть ли какие нибудь книги или информационные ресурсы посвященные высоким нагрузкам на серверы и их базы данных? | |
|
|
|
|
|
|
|
для: hk416
(09.03.2012 в 23:00)
| | блин, время ночь, спать хочу нереально,
а по телеку "Сладкий ноябрь", а выключить рука не поднимается | |
|
|
|
|
|
|
|
для: hk416
(09.03.2012 в 23:00)
| | да, сорри, забыл что цикл с нуля :)
тут вот еще в чем морковка
запросы в цикле - это большая нагрузка на сервер mysql
если клиент один, то еще ничего, а если выборку проводят одновременно несколько десятков клиентов, то "вешалка"
сейчас думаю как организовать это одним запросом
с группировкой по часам и минутам в принципе знаю как сделать, теперь думаю как организовать интервалы
___
попробуйте этот код поставив свои значения интервала
код работает капелюшечку не так как вы хотели, но мне кажется такой подход более грамотный
возможно результат вас устроит
<?php
include('connect.php'); // подключение к базе данных
$start="2011-12-01 00:01:00";
$end="2011-12-01 00:12:00";
$minute=3; // интервал в минутах
$sec=$minute*60; // интервал в секундах
$query="SELECT COUNT(*) t, min(reg_date) start, max(reg_date) end
FROM regs
WHERE reg_date BETWEEN '$start' AND '$end'
GROUP BY FLOOR(UNIX_TIMESTAMP(reg_date)/$sec)";
$res=mysql_query($query); // or die(mysql_error());
if($res){
if(mysql_num_rows($res)>0){
while($a=mysql_fetch_assoc($res)){
echo "Минимальное ".$a[start]." и максимальное ".$a[end]." значения времени в заданном промежутке <br />";
echo "Общее количество пользователей за выбранный промежуток времени: {$a[t]} <br />";
}
}else{
echo "База данных не содержит записи в указанный промежуток времени.<br />";
}
}else{
echo "Ошибка выполнения запроса к базе данных: ".mysql_error()."<br />";
}
?>
|
| |
|
|
|
|
|
|
|
для: Valick
(09.03.2012 в 19:17)
| | замечание по логике кода
у вас не учитываются первые 10 минут
Проверил все работает, тем более в цикле 1-й раз задается отрезок от 0 до 10 минут ))) Я уж испугался что ошибка есть, на самом деле все правильно работает. | |
|
|
|
|
|
|
|
для: hk416
(09.03.2012 в 18:38)
| | Интересно почему на этом форуме нельзя удалять сообщения?:))
фишка такая :)
---
удалять нельзя, но есть маленький секрет, можно редактировать пока не ответили, и редактировать до одного любого символа, обычно ставится тире
__
замечание по логике кода
у вас не учитываются первые 10 минут | |
|
|
|
|
|
|
|
для: Valick
(09.03.2012 в 16:47)
| | Уважаемый Valick, я перед вами извиняюсь, оказывается мой скрипт, работает. Я дурень ошибся с данными таблицы, в общем большое вам спасибо за помощь!!! Интересно почему на этом форуме нельзя удалять сообщения?:))
С уважением к вам и вашему труду HK416 !!! | |
|
|
|
|
|
|
|
для: Valick
(09.03.2012 в 16:47)
| | Уважаемый Valick, я понимаю что вы бы эту программу написали бы по другому, просто мне нужна ваша помощь, я не понимаю почему мой скрипт, моё так сказать детище, не пашет, в общем вот он. $i<(6*24*2) это типа сколько 10 минутных отрезков надо пройти за 2 дня, от даты '2009-09-21 00:00:00'.
for($i=0;$i<(6*24*2);$i++){
$time1=$time2=0;
$time1=10*$i;
$time2=$time1+10;
$zap="SELECT COUNT(*) FROM regs WHERE reg_date >=('2009-09-21 00:00:00' + INTERVAL '$time1' MINUTE) AND reg_date < ('2009-09-21 00:00:00' + INTERVAL '$time2' MINUTE)";
$dev = mysql_query($zap);
$a=mysql_result($dev, 0, 0);
echo "$a <br>";
}
|
С уважением к вам и вашему труду HK416 !!! | |
|
|
|
|