0

我有一个 PHP 应用程序从 MySQL 数据库中检索数据。当 PHP 查询数据库时,会提取结果并将所有输出行打印到屏幕上,但在顶部还会打印一个图表,以显示输出行。如下所示(这是一个 24 垂直线的条形图,因为 MySQL 从代表 PHP 执行的查询中产生了 24 行输出);

24行MySQL输出

如果用户运行产生大量结果的查询,就会出现我面临的问题。再往下的第二张图片是在 PHP 应用程序中使用不同的可选参数代表 PHP 查询时 MySQL 生成的 150 个结果的可视化表示。我想要最大数量的垂直线(例如,让我们说 50 条)。当查询产生超过 50 行时,我们将 MySQL 结果合并为仅 50 行以进行可视化。我仍将打印图表下方的所有行,以便用户可以查看任何一个结果,如果他们愿意的话。我的问题是,在 CPU 周期方面做到这一点的最佳方法是什么,而不是太难以理解和遵循代码?

150行MySQL输出

我的一个想法是在 PHP 应用程序中解决这个问题,我只需将 MySQL 输出的行数除以 50(再次假设简单的数字,在这种情况下舍入是一个简单的问题)。如果 MySQL 产生 500 行,500 除以 50 就是 10,所以我使用每 10 行在条形图上画一条垂直线。

另一个想法是在 MySQL 中解决这个问题。我也许可以运行 MySQL 查询,然后将结果复制到一个变量,然后针对每 10 行选择一次的查询运行第二个查询,或者如果有某种方法可以在 MySQL 中进行整合,然后呈现第二个较小的数据集到 PHP。

解决这个问题的最佳地点在哪里,为什么以及如何解决?

更新

根据要求进一步解释,它确实是一个非常基本的场景:

结果如下所示,每一行是一个整数值和一个时间戳(条形图显示时间段[X轴]的值[Y轴]);

row | value | timestamp 
 1  | 10    | 1234-01-01 10:30
 2  | 10    | 1234-01-01 10:35
 3  | 15    | 1234-01-01 10:40
 4  | 15    | 1234-01-01 10:45
 5  | 10    | 1234-01-01 10:50

当 MySQL 产生 150 行输出时,我们得到类似于上面第二张图的结果。我正在尝试创建一个合并功能,因为如果查询产生 300 个结果或示例,条形图中的线条几乎不可见,因为它们太细了。这变成了不必要的视觉粒度级别。

4

1 回答 1

0

I have solved this issue my self in the PHP application quite simply, rather than making SQL do the work.

In the application I have an array that contains all the MySQL result rows. PHP loops through each Array entry and echo's out the Javascript to display it as a vertical bar on the bar chart.

Inserting this code before that loop solved the issue in a simple and enough manner;

$maxbars = 50;
if(count($array_mysql_resutls)>$maxbars) {
    $devision = count($array_mysql_resutls)/$maxbars;
    $resultsarray = Array();
    for($i = 0; $i < $maxbars; $i++) {
        $resultsarray[$i] = $array_mysql_resutls[ceil($devision*$i)];
    }
    $graph_traces = $resultsarray;
}

Most importantly, we are rounding up the divided figure (ceil()) for an even spread across the results set.

于 2013-07-24T10:15:16.297 回答