【问题标题】:json DataTable in googlechartsgooglecharts中的json数据表
【发布时间】:2013-12-26 07:22:59
【问题描述】:

我在获取正确格式的 json 字符串时遇到了一些麻烦。

我有一个看起来像这样的数据库表:

Table Columns: emp   month   sales 
Table rows:    Bob    1       100
               Bob    2       150
               Jane   1       125
               Jane   2       130
               Mary   1       110
               Mary   2       130

在 drawChart() 中,我可以静态地创建这样的东西:

var data = google.visualization.arrayToDataTable([
    ['Month', 'Bob', 'Jane', 'Mary],
    ['Jan',  100, 125, 110],
    ['Feb',  150, 130, 130]
    ]);

最后,json字符串需要是这样的:

{"cols":[{"label":"Month","type":"string"},
        {"label":"Bob","type":"number"},
        {"label":"Jane","type":"number"},
        {"label":"Mary","type":"number"}],
"rows":[{"c":[{"v":100},{"v":125},{"v":110}]},
        {"c":[{"v":150},{"v":130},{"v":130}]}]}

但我无法从表格中提取与上述等效的正确 json 格式。我正在按照这里的步骤...PHP MySQL Google Chart JSON - Complete Example

但该示例仅适用于单个数据集。如果您要添加数周而不是只有一个数据集,如何运行查询?

【问题讨论】:

  • 您能否详细说明您需要了解的示例中缺少的内容? “如果您要添加多个星期而不是只有一个数据集”是什么意思?查看您的示例数据库表和您构建 JSON 的方式(顺便说一下,这是格式错误的),这两种布局完全不同(如果您真的想重新组织数据结构,则需要在查询中进行一些调整)。图表的最终目标是什么?
  • 示例中没有“遗漏”;相反,我想扩展这个例子——而不是只有一周的数据,如果你有超过 2 周的数据呢?换句话说,添加第 3 列(称之为“周” - 表示执行工作的周)。然后在第 1 周再次添加 4 行;然后为第 2 周添加另外 4 行,依此类推。只有一周数据的查询按原样工作,但是一旦添加第 3 列和多周数据,查询就不那么直接了。最终目标是我需要最终与我调用 arrayToDataTable() 中的静态示例相同。
  • 在格式错误的 json 字符串上:是的,这并非不可能,因为我剥离了实际字符串以使其尽可能简单,并且可能在编辑时弄乱了字符串
  • --“需要在查询中进行一些修改......” - 是的,正是我遇到的问题是让查询输出格式正确的数据。
  • 另注:我修复了上面的json字符串:上面的json字符串是最终目标

标签: php mysql json google-visualization


【解决方案1】:

要以所需格式获取数据,您必须对数据进行透视。一些数据库支持数据透视,但其他数据库如 MySQL 不支持。如果您在没有枢轴支撑的情况下陷入困境,那么您必须使用诡计来实现它。这是您可以做到的一种方法:

SELECT
    month,
    SUM(if(employee = "Bob", sales, 0)) AS Bob,
    SUM(if(employee = "Jane", sales, 0)) AS Jane,
    SUM(if(employee = "Mary", sales, 0)) AS Mary
FROM myTable
GROUP BY month

这要求您提前知道员工姓名,以便您可以编写 SQL 语句(在您编写代码时,或者您可以从另一个 SQL 查询中提取它们并编写动态 SQL 查询)。

【讨论】:

    【解决方案2】:

    Asgallent,谢谢。您的回复给了我所需的方向。我能够通过 SQL 动态地完成这一切。我进行了两个查询:1 到“销售人员”表以获取名称,然后另一个以按照您的建议旋转数据。对于其他可能觉得这很有帮助的人,这是我的代码。

    查询(注意:我使用的是 codeigniter):

    $sp_qry = $this->db->query('select * from salespeople');
    
            $qryString="";
            foreach ($sp_qry->result_array() as $row)
            {
                $qryString.= ",SUM( IF(  `salespeople_id` =" . $row['salespeople_id'] . ",  `num_sold` , 0 ) ) AS " . $row['name'];
            }
    
            $qry= "SELECT  `month` " . $qryString . " FROM  `product_sales` 
                  GROUP BY  `month`";
    
            $query = $this->db->query($qry);
            return $query->result_array();
    

    在我的浏览页面中

    $rows = array();
    $table = array();
    $cols = array();
    $cols[] = array('label' => 'Month', 'type' => 'string');
    foreach ($salespeople as $sp)
       {
           $cols[] = array('label' => $sp['name'], 'type' => 'number');
       }
    
    $table['cols'] = $cols;
    
    
    foreach ($sales as $chart_item)
    {  
        $tmp=array();
        $tmp[] = array('v' => (string) $chart_item['month']);
        foreach ($salespeople as $sp)
        {
            $name=$sp['name'];
            $tmp[] = array('v' => (int) $chart_item[$name]);
        }
    
        $rows[] = array('c' => $tmp);
    }
    
    $table['rows'] = $rows;
    $jsonTable = json_encode($table);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      相关资源
      最近更新 更多