Как то так?
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);
?>