组织成员将日期/成员增长数据加入可移动的块中

时间:2010-08-20 01:37:41

标签: php mysql

我正在讨论pChart,并希望从一个简单的折线图开始,显示会员数随时间的增长。

Y轴是成员的数量,X轴是时间

对于每次数据点,我需要一个相应的总成员数据点。

我的用户表结构如下:     [user_id] [join_date]

我今天早上在公交车上出现的方法是:

$Q = " SELECT MONTH(join_date), DAY(join_date), COUNT(user_id)"
   . " FROM user_basic_data GROUP BY join_date";
$R = mysql_query($Q);

$dateS = '';
$totalS = '';
$c = 0; // total members counter
while ($row = mysql_fetch_row($R)) {
    $dateS .= $row[0].'-'.$row[1].','; // month-day,month-day,month-day
    $c = $row[2] + $c; // new total for new date
    $totalS .= $c.','; // total1,total2,total3
}
// trim trailing commas
$dateS = substr($dateS, 0, -1);
$totalS = substr($totalS, 0, -1);

echo "<p>$dateS</p>"; // Ex: 8-10,8-15,8-20
echo "<p>$totalS</p>"; // Ex: 12,17,23

这些字符串格式是pChart喜欢数据的方式,我知道当前查询还需要一年的值才能实际使用,所以请不要挂断这些点。

我想知道是否有更好的方法可以随着时间的推移获得不断变化的总成员。我猜测在MySQL中处理它会更快,但我想不出办法做到这一点。

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

要获得总计,请使用:

SELECT DISTINCT
       DATE(ubd.join_date) AS dt, 
       (SELECT COUNT(*)
          FROM user_basic_data t
         WHERE DATE(t.join_date) <= DATE(ubd.join_date)) AS num_users
  FROM user_basic_data ubd 

DATE将日期返回为YYYY-MM-DD;将DATE(udb.join_date)替换为:{/ 3>,If you still want Month-Day - use DATE_FORMAT

DATE_FORMAT(ubd.join_date), '%m-%d')

您不需要在PHP中创建逗号分隔列表的逻辑 - 只需要填充两个变量:

$Q = " SELECT GROUP_CONCAT(x.dt) AS dates,
              GROUP_CONCAT(x.num_users) AS totals
         FROM (SELECT DISTINCT
                      DATE(ubd.join_date) AS dt, 
                      (SELECT COUNT(*)
                         FROM user_basic_data t
                        WHERE DATE(t.join_date) <= DATE(ubd.join_date)) AS num_users
                 FROM user_basic_data ubd ) x";
$R = mysql_query($Q);

while ($row = mysql_fetch_row($R)) {
   echo "<p>$row[0]</p>"; // Ex: 8-10,8-15,8-20
   echo "<p>$row[1]</p>"; // Ex: 12,17,23
}