我有一个PHP应用程序从MySQL DB中检索数据。当PHP查询数据库时,会拉取结果并将所有输出行打印到屏幕上,但在顶部还会打印一个图形,显示输出行的可视化。如下所示(这是一个24垂直线条形图,因为MySQL从代表PHP执行的查询中产生了24行输出);
如果用户运行产生大量结果的查询,则会出现问题。下面的第二张图是在PHP应用程序中使用不同的可选参数代表PHP查询时生成的150个结果的可视化表示。我想有一个最大数量的垂直线(例如,让我们说50)。当查询产生超过50行时,我们将MySQL结果合并为50行以进行可视化。我仍将打印图表下方的所有行,以便用户可以根据需要查看任何一个结果。我的问题是,关于CPU周期执行此操作的最佳方法是什么,而不是太难理解并遵循代码?
我有一个想法是在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个结果或示例,条形图中的行几乎不可见,因为它们太薄了。这成为不必要的视觉粒度级别。
答案 0 :(得分:0)
我在PHP应用程序中非常简单地解决了这个问题,而不是让SQL完成工作。
在应用程序中,我有一个包含所有MySQL结果行的数组。 PHP遍历每个Array条目并回显Javascript,将其显示为条形图上的垂直条。
在该循环之前插入此代码以简单且足够的方式解决了该问题;
$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;
}
最重要的是,我们将分割后的数字(ceil()
)四舍五入,以便在结果集中均匀分布。