【问题标题】:Altering Graph generated using PHP/MySQL更改使用 PHP/MySQL 生成的图形
【发布时间】:2011-06-23 05:09:18
【问题描述】:

我正在查看一个非常简单的 PHP 代码,它使用我们的计费系统的 API 来生成图表。截至目前,它显示了每位员工的平均票务评级。我想将其更改为仅显示当年每月的平均票价。

在同一张表中有一个“日期”字段,其中包含为每张工单格式化的值,例如“2010-08-23 00:48:22”。

如何更改此代码以显示给定年份的每月平均票务评级?

<?php

if (!defined("WHMCS"))
    die("This file cannot be accessed directly");

$description = "This graph shows average support ratings by staff member";

if ($statsonly) { return false; }

$chartdata = array();

$query  = "SELECT DATE_FORMAT(date, '%m-%Y') AS theMonth, AVG(rating) AS avgRating ";
$query .= "FROM tblticketreplies WHERE admin != '' AND rating !='0' ";
$query .= "GROUP BY DATE_FORMAT(date, '%m-%Y') ";
$query .= "ORDER BY avgRating ASC";
$result = mysql_query($query);

//$query = "SELECT admin, AVG(rating) AS avgrating FROM `tblticketreplies` WHERE admin != '' AND rating!='0' GROUP BY admin ORDER BY avgrating ASC";
//$result = mysql_query($query);

while ($data = mysql_fetch_array($result))
{
    $chartdata[$data[0]] = round($data[1],2);
}

$graph=new WHMCSGraph(650,400);
$graph->addData($chartdata);
$graph->setTitle("Average Support Ticket Ratings by Month");
$graph->setGradient("lime", "green");
$graph->setDataValues(true);
$graph->setXValuesHorizontal(true);

?>

【问题讨论】:

    标签: php mysql api graph whmcs


    【解决方案1】:

    您首先需要更改查询以返回每月的平均评分,而不是像现在这样的每个“管理员”的平均评分。我不知道数据库中包含日期的列的名称,但可以说它名为“MyDateColumn”。

    要获得每月平均值,您需要一个类似于以下内容的查询:

    $query  = 'SELECT DATE_FORMAT(MyDateColumn, "%m-%Y") AS theMonth, AVG(rating) AS avgRating ';
    $query .= 'FROM tblticketreplies ';
    $query .= 'GROUP BY DATE_FORMAT(MyDateColumn, "%m-%Y") ';
    $query .= 'ORDER BY avgRating ASC';
    

    DATE_FORMAT 函数提供了魔力。它将“MyDateColumn”格式化为 MM-YYYY(例如“06-2011”)。在 GROUP BY 中使用相同的格式来完成查询。

    更改代码的 setTitle 部分以标记来自查询的新数据:

    $graph->setTitle("Average Support Ticket Ratings per Month");
    

    另外,请注意我从您的查询中删除了 WHERE 子句。在它排除具有空“管理员”或空评级的“ticketreplies”之前。您应该根据要包含在图表中的数据来评估将其添加回查询中。

    希望对您有所帮助。

    ~~ 编辑:

    解决下面的 cmets - 上面的查询按 avgRating 排序,因此您的图表将始终从低评级值变为高评级值。要将其从最早的月份转移到最近的月份,请更新ORDER BY。使用ORDER BY DATE_FORMAT(MyDateColumn, "%Y-%m")%Y-%m 在此处颠倒,以确保排序正常工作。年份是这里最重要的元素,所以它排在第一位。较不重要的月份元素排在最后。

    最后,要将图表限制为仅显示当前用户,请在 FROM 子句和 GROUP BY 子句之间添加 WHERE 子句。使用:WHERE YEAR(MyDateColumn) = YEAR(CURDATE()) 这指示 MySQL 仅在 MyDateColumn 中日期的年份与当前日期的年份相同时才考虑表中的元素。

    请给MySQL date-time functions 一个评论。以后你会感谢自己的。 =)

    【讨论】:

    • 效果很好,非常感谢。感谢您对正在发生的事情的精彩解释。不过有两个问题......它似乎不按顺序排列,第一个栏是 11-2010,第二个是 10-2010、12-2010、8-2010 等。其次,我怎么能限制在今年?
    • 请注意,我已经使用更新后的代码更新了初始帖子中的代码块。我还将您的答案标记为“已回答”。只是想在这两个问题上等待您的回复:)
    猜你喜欢
    • 1970-01-01
    • 2014-11-19
    • 2012-02-06
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    相关资源
    最近更新 更多