Статистика на основе MySQL и PHP - PullRequest
1 голос
/ 23 сентября 2010

Я собираюсь сгенерировать некоторую статистику на основе значений таблицы MySQL. Я хотел бы сгенерировать некоторые числа для каждого месяца года и каждого дня месяца.

Конечно, я мог бы сделать все это вручную, но это не похоже на хороший подход :) Так что любой, кто имеет некоторые идеи о том, как я генерирую эту статистику.

OBS. Я хотел бы получить весь месяц года, даже если в данный месяц нет записей MySQL.

БОНУС: У меня небольшой бонусный вопрос. Таблица, которая предоставляет данные для статистики, будет получать около 1000 записей в неделю. Мне моя голова кажется со временем плохим подходом. Любой, у кого есть предложение для лучшего подхода, приветствуется. Я думал о создании файлов CSV вместо этого.

Заранее большое спасибо. Это ценится!

РЕДАКТИРОВАТЬ: Как и просили

+---------------+------------+------+-----+-------------------+----------------+
| Field         | Type       | Null | Key | Default           | Extra          |
+---------------+------------+------+-----+-------------------+----------------+
| id            | int(11)    | NO   | PRI | NULL              | auto_increment |
| member_id     | int(4)     | NO   |     | 0                 |                |
| status        | tinyint(1) | NO   |     | 0                 |                |
| timestamp     | timestamp  | NO   |     | CURRENT_TIMESTAMP |                |
+---------------+------------+------+-----+-------------------+----------------+

1 Ответ

2 голосов
/ 23 сентября 2010

Как то так?

select count(status) as total, year(timestamp) as yr, month(timestamp) as mnth  from mytable  group by yr,mnth

Что касается вашего бонусного вопроса, 1000 записей в неделю - это не так много. Как поможет переключение на файл CSV? Вы все равно будете получать 1000 записей в неделю.

редактировать

select count(status) as total, year(timestamp) as yr, month(timestamp) as mnth, day(timestamp) as dy  from mytable  group by yr,mnth,dy

Редактировать 2

select count(status) as total, year(timestamp) as yr, month(timestamp) as mnth, day(timestamp) as dy, to_days(timestamp) daynum  from mytable  group by yr,mnth,dy

Я добавил поле to_days, которое поможет вам определить пропущенные дни при просмотре результатов, daynum должен быть последовательным.

Редактировать 3

ОК. Я попробовал, но это не проверено, и помните, что PHP - мой 4-й или 5-й язык. Я почти уверен, что некоторые из присутствующих здесь гуру могли бы сделать это более элегантно.

<?php

$con = mysql_connect("myhost","myusername","mypassword");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("mydatabase", $con);

$result = mysql_query("select count(status) as total, year(timestamp) as yr, month(timestamp) as mnth, day(timestamp) as dy, to_days(timestamp) as daynum  from mytable  group by yr,mnth,dy");

$row = mysql_fetch_array($result);
$counter=$row['daynum']-$row['day']+1; // set up the daynum counter an initiaise to the first day of the month "-$row['day']+1"

//print out any blank rows at the beginning of the month
for ($i = $counter; $i <=$row['daynum'] ; $i++) {
    echo "A blank row";
}

// start to loop through the result set
$finished=false;
do {

if($counter=$row['daynum']){  // if the daynumber of the row matches the counter then  print the row and get the next row 

    echo "an output row from db".$row('dy')."-".$row('mnth')."-".$row('yr')."-----".$row('total');
    $lastday=$row['dy'];
    $lastmonth=$row['mnth'];
    $lastyear=$row['yr'];   

    $row = mysql_fetch_array($result);
    if (!$row) finished=true;

} else { // if the counter if not equal it must be less than $row['daynum'] so print blank rows and increment counter until it matches the current row.

    $mytime = $counter*24*60*60;   //convert days to seconds, because PHP doesn't seem to have a from_days function
    $mydate = strftime("%Y-%m-%d", $mytime); //convert seconds to date
    echo $mydate."a blank row"

    $counter=$counter+1;
    }

} while ( ! finished);


// print out any blank days at the end of the month
$daysinmonth = cal_days_in_month(CAL_GREGORIAN, $lastmnth, $lastyear);

for ($i = ($lastday+1); $i <=$daysinmonth; $i++) {
    echo $i."-".$lastmonth."-".$lastyear." ---  A blank row";
}



mysql_close($con);

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...