【问题标题】:How to put data from MySQL table to Google Chart API?如何将 MySQL 表中的数据放入 Google Chart API?
【发布时间】:2013-08-08 09:22:37
【问题描述】:

我正在努力研究如何利用我拥有的数据制作图表,这是一个示例。

我的带有虚拟数据的图表应如下所示:

function drawChart() {
    var data = google.visualization.arrayToDataTable([
    ['Month', 'Margarita Murphy', 'Lora Gonzales', 'Mario Moran', 'Wefico Local Faire', 'Zegko Collection', 'Saxux Program for Youth', 'Test New location venue'],
    ['4/12', 9, 74, 10, 8, 93, 33, 90], 
    ['5/12', 10, 168, 0, 10, 198, 108, 154], 
    ['6/12', 9, 174, 12, 12, 165, 96, 261], 
    ['7/12', 12, 288, 8, 36, 180, 264, 140], 
    ['8/12', 40, 275, 15, 30, 275, 395, 170], 
    ['9/12', 54, 534, 30, 48, 240, 246, 552], 
    ['10/12', 28, 518, 63, 28, 182, 672, 98], 
    ['11/12', 56, 520, 8, 64, 424, 568, 704], 
    ['12/12', 45, 675, 9, 63, 864, 567, 756], 
    ['1/13', 90, 570, 40, 70, 350, 510, 150], 
    ['2/13', 55, 946, 110, 55, 253, 429, 88], 
    ['3/13', 96, 684, 12, 96, 528, 1140, 468], 
    ['4/13', 52, 832, 104, 130, 1261, 1235, 663], 
    ['5/13', 28, 756, 70, 70, 1050, 910, 728], 
    ['6/13', 105, 930, 15, 60, 1440, 660, 690], 
    ['7/13', 144, 1600, 96, 64, 1312, 1488, 1120], 
]);

因此,您可以看到它有一个项目列表,以及它每月的浏览量可以追溯到过去。

我遇到的问题是,当我从 MySQL 获取数据时,我想遍历视图,这将在列中垂直向下,而不是交叉。我将如何让它像这样水平:

['4/12', item1.views, item2.view]
['5/12', item1.views, item2.view]

我对此感到非常困惑......

示例数据

-------------------
|date|views|ref_id|
|----|-----|------|
|4/12|123  |2     |
|5/12|526  |7     |
|6/12|2    |1     |
|7/12|46   |3     |
-------------------

编辑:

首先将日期设置为变量,然后循环遍历所有内容并将数据添加到正确的数据?

$month4_12 = "['4/12', ";
$month5_12 = "['5/12', ";

foreach($views_data as $data){
    ${"month_$data->date"} .= $data->views . ', ';
}

$month4_12 .= "],";
$month5_12 .= "],";

EDIT2:

所以这就是我现在所拥有的,但它有一些问题,如果视图表不包含记录,则不算数,因为它只会超出它在数据库中找到的内容......这显然不是不起作用,因为与标题相比,它没有正确数量的列。

// Get views for chart
$views_data = $this->content_model->get_chart_view_data();

// First make the months
$month = 1;
while($month <= 16){
    $month_text = date('d/m/y');
    $month_text = strtotime($month_text . ' -'.$month.' months');
    $month_text_display = date('n/y', $month_text);
    $month_text_variable = str_replace('/', '_', $month_text_display);
    ${"month_$month_text_variable"} = "['".$month_text_display."', ";

    // Now add the data
    foreach($views_data as $row){
        ${"month_$month_text_variable"} .= $row->views . ', ';
    }
    ${"month_$month_text_variable"} = rtrim(${"month_$month_text_variable"}, ", ");

    // Finish the lines
    ${"month_$month_text_variable"} .= "],\n";

    $month++;
}

// Now join the lot!
$month = 1;
$chart_data = '';
while($month <= 16){
    $month_text = date('d/m/y');
    $month_text = strtotime($month_text . ' -'.$month.' months');
    $month_text_display = date('n/y', $month_text);
    $month_text_variable = str_replace('/', '_', $month_text_display);
    $chart_data .= ${"month_$month_text_variable"};
    $month++;
}

$data['chart_data'] = rtrim($chart_data, ",\n");

echo $data['chart_data'];

这给出了输出:

function drawChart() {
        var data = google.visualization.arrayToDataTable([
        ['Month', 'Margarita Murphy', 'Lora Gonzales', 'Mario Moran', 'Wefico Local Faire', 'Zegko Collection', 'Saxux Program for Youth', 'Test New location venue'],
        ['7/13', 2, 1, 1],
        ['6/13', 2, 1, 1],
        ['5/13', 2, 1, 1],
        ['4/13', 2, 1, 1],
        ['3/13', 2, 1, 1],
        ['2/13', 2, 1, 1],
        ['1/13', 2, 1, 1],
        ['12/12', 2, 1, 1],
        ['11/12', 2, 1, 1],
        ['10/12', 2, 1, 1],
        ['9/12', 2, 1, 1],
        ['8/12', 2, 1, 1],
        ['7/12', 2, 1, 1],
        ['6/12', 2, 1, 1],
        ['5/12', 2, 1, 1],
        ['4/12', 2, 1, 1]
]);

编辑 3

这里是views数据在数据库中的存储方式,可以看到没有views的一天根本就没有记录

【问题讨论】:

  • 您能否添加一个示例,说明您的“垂直”数据的外观,给我们一个想法
  • 好的,我不知道其他人,你能不能给我一个意见,你希望它看起来如何,对不起,我今天很慢
  • 我已经添加了到目前为止的代码,如果有帮助,它就是输出
  • 所以我猜2, 1, 1] 只对7/13 是正确的,对于其他人应该是不同的?
  • 是的,数据库中只有 1 天的数据,所以其他的都应该是 0

标签: php mysql sql google-visualization


【解决方案1】:

您需要在 SQL 查询中对数据进行透视。由于 MySQL 本身不支持枢轴,因此您必须作弊。最终输出中的每个透视列都将采用以下形式:

IF(ref_id = <this column's reference id>, views, 0) AS <column name>

然后按日期列分组,如下所示:

SELECT
    data,
    IF(ref_id = 327, views, 0) AS column_327,
    IF(ref_id = 329, views, 0) AS column_329,
    // etc...
FROM <table name>
WHERE <conditions>
GROUP BY date

然后您可以遍历输出以构建 DataTable 对象。

如果您事先不知道所有的 ref_id 值(或者它们很多),那么您可以查询以获取 ref_id 的列表并以编程方式构建查询:

SELECT DISTINCT ref_id FROM <table name>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-25
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多