|
|
|
| День Добрый коллеги! В общем решил кое что написать и встретился с проблемой. В общем имеется простая таблица
CREATE TABLE `regs` (
`user_id` int(11) NOT NULL default '0',
`login` varchar(50) NOT NULL default '',
`reg_date` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`user_id`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8
Задача скрипта, посчитать сколько строк в таблице, лежащих в определенном временном интервале который мы сами задаём. И вот допустим я по ней делаю запрос, с начало я его пишу просто для проверки в консоли phpmyadmin, и все работает, вот этот запрос
SELECT COUNT( * )
FROM regs
WHERE reg_date >= ( '2009-09-21' )
AND reg_date < ( '2009-09-21' + INTERVAL '60000'
MINUTE )
|
Но это запрос мне понятное дело нужен в скрипте PHP, и что то там он у меня уже не работает, вот нужный кусочек этого скрипта.
$zap="SELECT COUNT (*) FROM regs WHERE reg_date >= ( '2009-09-21') AND reg_date<( '2009-09-21' + INTERVAL '60000' MINUTE)";
$dev = mysql_query($zap);
echo "$dev";
|
В общем, не знаю почему но в ПХП этот запрос уже не работает, скажите пожалуйста почему.
И ещё вопрос, как вместо интервала '60000' вставить переменную, так что бы все работало?
Если это поможет, то вот тестовые данные таблицы, и результат подсчёта равен 7, как нетрудно догадаться.
user_id login reg_date
0 ergherth 2009-09-21 00:00:02
1 ergherth 2009-09-21 00:00:02
2 werytwery 2009-09-21 00:00:05
3 xcbxfbxcvb 2009-09-21 00:00:23
4 sdgagag 2009-09-21 00:00:37
6 gsfhgsfhs 2009-09-22 00:50:00
7 sdfhsfh 2009-09-22 03:00:00
|
С уважением к вам и вашему труду HK416 !!! | |
|
|
|
|
|
|
|
для: hk416
(09.03.2012 в 05:31)
| | $dev - это не результат запроса, это дескриптор (ссылка на результат запроса)
<?php
$zap="SELECT COUNT(*) FROM regs WHERE reg_date >= ('2009-09-21') AND reg_date < ('2009-09-21' + INTERVAL '60000' MINUTE)";
$dev = mysql_query($zap);
if($dev){
while($r=mysql_fetch_assoc($dev)){
echo $r[user_id]." ";
echo $r[login]." - ".$r[reg_date]."<br />";
}
}else{
echo "Ошибка запроса: ".mysql_error();
}
?>
|
еще не плохо бы добавить в запрос сортировку, обычно в таких случаях сортируют по дате
ORDER BY reg_date
__
почему 60000 минут? почему не дни? 10 DAY например
$m="60000";
$zap="SELECT COUNT(*) FROM regs WHERE reg_date >= ('2009-09-21') AND reg_date < ('2009-09-21' + INTERVAL $m MINUTE)";
|
| |
|
|
|
|
|
|
|
для: Valick
(09.03.2012 в 07:35)
| | Уважаемый Valick, я благодарю вас за ответ и за то что вы поправили запрос $zap и дело немного сдвинулось с мёртвой точки, но вы немного поспешили и неправильно поняли суть скрипта, мне не нужно в браузере печатать эту таблицу согласно условию ('2009-09-21') AND reg_date < ('2009-09-21' + INTERVAL '60000' MINUTE), а нужно напечать количество строк в таблице удовлетворяющие этому условию, то есть сколько людей залогинилось в этом промежутке времени, вы же не могли не заметить SELECT COUNT(*) в запросе, вы наверное лучше меня знаете что ф-я COUNT в SQL, призвана считать строки, а дескриптор в данном случае $dev = mysql_query($zap) есть не что иное как результат подсчёта, он то мне и нужен. Мне кажется вы опытнее меня и знаете как этот скрипт поправить. По поводу 60000 минут, это так тестовое время, было поставлено наобум, так же как и логины в этой таблице, они все равно не нужны. Просто как только, скрипт начнёт выдавать какую то цифру, мне ещё нужно поменять 60000 минут на переменную, что бы через неё контролировать это интервал, и в конце запрос $zap в общем должен выглядеть вот так
$zap="SELECT COUNT(*) FROM regs WHERE reg_date >=('2009-09-21' + INTERVAL '$time1' MINUTE) AND reg_date < ('2009-09-21' + INTERVAL '$time2' MINUTE)";
|
Т.Е, как вы понимаете 2-я переменными я пытаюсь контролировать отрезки времени с '2009-09-21'.
С уважением к вам и вашему труду hk416 | |
|
|
|
|
|
|
|
для: Valick
(09.03.2012 в 07:35)
| | В общем не без вашей поддержки мне удалось продвинуться в своей задаче и вот часть того скрипта которая мне нужна
$zap="SELECT COUNT(*) FROM regs WHERE reg_date >=('2009-09-21' + INTERVAL '$time1' MINUTE) AND reg_date < ('2009-09-21' + INTERVAL '$time2' MINUTE)";
$dev = mysql_query($zap);
$a=mysql_result($dev, 0, 0);
echo $a;
|
Сейчас, я его отлаживаю, потому как есть подозрение что как нужно все равно работать не будет, то есть опять же запросом $zap я задаю отрезок времени в котором мне нужно знать количество записей, вчера в консоли MySQL верные цифры вроде как он показывать не захотел.
С уважением к вам и вашему труду hk416 | |
|
|
|
|
|
|
|
для: hk416
(09.03.2012 в 16:29)
| | вы же не могли не заметить SELECT COUNT(*)
мог, а тем более через 10 минут начиная с того времени как проснулся :)
а дескриптор в данном случае $dev = mysql_query($zap) есть не что иное как результат подсчёта
еще раз повторяю, это никакой не результат, это номер установленного соединения с базой данных по которому можно извлечь результат запроса
кстати зачем вам интервал относительно какой-то даты? просто обычно если и указывают интервал, то относительно текущего момента времени с использованием функции NOW(), а в других случаях можно указывать сразу даты интервала
ну и еще есть функция BETWEEN просто с ней код более наглядный и удобочитаемый, сразу понятно что речь идет о интервале
___
я лично не особо люблю использовать функцию mysql_result, и этот результат так же можно извлечь при помощи указанной мной функции mysql_fetch_assoc
if($dev){
while($r=mysql_fetch_assoc($dev)){
echo $r[COUNT(*)];
}
}
|
а еще лучше назначить алиас для COUNT(*) например так COUNT(*) AS t или COUNT(*) t в самом запросе и при выборке уже ссылаться на него
if($dev){
while($r=mysql_fetch_assoc($dev)){
echo $r[t];
}
}
|
| |
|
|
|
|
|
|
|
для: Valick
(09.03.2012 в 16:47)
| | еще раз повторяю, это никакой не результат, это номер установленного соединения с базой данных по которому можно извлечь результат запроса
Полностью с вами согласен, просто в случае с COUNT немного запутался, в книгах что я читал было абстрактно написано, не так как с выводом каких то данных там то все понятно))
кстати зачем вам интервал относительно какой-то даты?
Да просто такая вот задача, увидел её интересно стало выполнить, нужно типа вывести результат подсчета, за каждые 10 минут времени начиная с этой даты, ну и этот отрезок длиной 10 минут благодаря циклу двигается и подсчитывает количество строк, и выводит в браузер, просто этот отрезок времени я действительно мог бы вводить сразу без помощи интервалов, но тогда кода придется больше писать, а чем меньше кода тем лучше программа по моему мнению, простота залог надежности ))) | |
|
|
|
|
|
|
|
для: 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 !!! | |
|
|
|
|
|
|
|
для: Valick
(09.03.2012 в 16:47)
| | Уважаемый Valick, я перед вами извиняюсь, оказывается мой скрипт, работает. Я дурень ошибся с данными таблицы, в общем большое вам спасибо за помощь!!! Интересно почему на этом форуме нельзя удалять сообщения?:))
С уважением к вам и вашему труду HK416 !!! | |
|
|
|
|
|
|
|
для: hk416
(09.03.2012 в 18:38)
| | Интересно почему на этом форуме нельзя удалять сообщения?:))
фишка такая :)
---
удалять нельзя, но есть маленький секрет, можно редактировать пока не ответили, и редактировать до одного любого символа, обычно ставится тире
__
замечание по логике кода
у вас не учитываются первые 10 минут | |
|
|
|
|
|
|
|
для: Valick
(09.03.2012 в 19:17)
| | замечание по логике кода
у вас не учитываются первые 10 минут
Проверил все работает, тем более в цикле 1-й раз задается отрезок от 0 до 10 минут ))) Я уж испугался что ошибка есть, на самом деле все правильно работает. | |
|
|
|
|
|
|
|
для: 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 />";
}
?>
|
| |
|
|
|
|
|
|
|
для: hk416
(09.03.2012 в 23:00)
| | блин, время ночь, спать хочу нереально,
а по телеку "Сладкий ноябрь", а выключить рука не поднимается | |
|
|
|
|
|
|
|
для: Valick
(10.03.2012 в 01:27)
| | Окей, и код изучим и на Шарлиз Терон в который раз посмотрим ))) Я спросить у вас хотел, а есть ли какие нибудь книги или информационные ресурсы посвященные высоким нагрузкам на серверы и их базы данных? | |
|
|
|
|
|
|
|
для: hk416
(10.03.2012 в 12:25)
| | нет именно по серверам у меня книг нет.
а по поводу кода, осталось доработать вывод, чтобы связать промежутки со значениями из базы | |
|
|
|
|
|
|
|
для: 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 периодичностью в одну секунду, а то хостер огорчит :)
___
надеюсь вы не ушли с форума в поисках форума покруче :)
а то получится зря старался :)
задача достаточно узконаправлена, вряд ли кому кроме вас понадобится
___
эх... видать зря, тогда и логику заполнения временной таблицы нет смысла дорабатывать :( | |
|
|
|
|
|
|
|
для: Valick
(11.03.2012 в 23:38)
| | Извиняюсь, что вовремя не ответил, код ваш обязательно изучу, просто то что я написал, по заданию нужно только 1 раз,и благо работает отменно, ваш код изучу, так как опыт всегда нужно набирать. А писать дополнительно действительно ничего не нужно потому что все уже и так есть.
С уважением к вам и вашему труду HK416 !!! | |
|
|
|
|