php - MYSQL - 选择最小和最大年份并填补空白

标签 php mysql

我想将 Highcharts (bar) 与我的数据库一起使用,但我正在努力如何使用我的选择来引入 JSON。

我有三个级别:黄金、白银、白金,我需要获得最低年份和最高年份,如果该级别在某年不存在,我需要弥补差距

我有这个选择:

select B.year, A.level, COUNT(B.id_level) as n_level from level AS A
inner join company_level AS B ON A.id_level = B.id_level 
GROUP BY B.id_level, B.year
ORDER BY B.year

我的结果:

year    level       n_level
2010    Siver       1
2010    Platinum    2
2010    Gold        2
2011    Gold        1
2013    Gold        1
2014    Platinum    1
2015    Silver      1

在我的结果中,我没有 2011 年的白银和白金,我想将白银和白金放入列表中,但 number_level (n_level) 为 0。

我的 PHP:

$rows = mysqli_query($this->conn, $query);
$bln = array();
$bln['name'] = 'Year';   
$row['name'] = 'Level'; 

$year =""; 
while ($r = mysqli_fetch_array($rows)) {
    if($year !== $r['year']){
        $bln['data'][] = $r['year']; 
    }
    $row['data'][] = $r['n_level']; 
    $year = $r['year']; 

}
$rslt = array();              

array_push($rslt, $bln);
array_push($rslt, $row);

print json_encode($rslt, JSON_NUMERIC_CHECK);

我的 PHP 结果:

[{"name":"Year","data":[2010,2011,2013,2014,2015]},{"name":"Level","data":[2,2,1,1,1,1,1]}]

但我的目标是:

[{"name":"Year","data":[2010,2011,2013,2014,2015]},{"name":"Gold","data":[2,2,1,1,1]}, {"name":"Silver","data":[1,0,0,0,1]}, {"name":"Platinum","data":[2,2,1,1,1]}]

感谢您的帮助。

@Tin Tran 回答后的结果:

$rows = mysqli_query($this->conn, $query);
                $bln = array();
                $bln['name'] = 'Year';   
                $row_gold['name'] = 'Gold'; 
                $row_platinum['name'] = 'Platinum';              
                $row_silver['name'] = 'Silver';                    

                while ($r = mysqli_fetch_array($rows)) {
                $bln['data'][] = $r['year'];
                $row_gold['data'][] = $r['gold'];
                $row_platinum['data'][] = $r['platinum'];              
                $row_silver['data'][] = $r['silver']; ''; 

                }
                $rslt = array();              

                array_push($rslt, $bln);
                array_push($rslt, $row_gold);
                array_push($rslt, $row_platinum);              
                array_push($rslt, $row_silver);             
                print json_encode($rslt, JSON_NUMERIC_CHECK);

此代码与 Highcharts 配合使用效果非常好。再次感谢@Tin Tran。

最佳答案

我不熟悉 php,但我认为基于您对 JSON 的目标, 此查询可能会为您提供所需的结果。

SELECT B.year,
       SUM(A.level = 'Gold') as Gold,
       SUM(A.level = 'Silver') as Silver,
       SUM(A.level = 'Platinum') as Platinum
FROM level AS A
INNER JOIN company_level AS B ON A.id_level = B.id_level
GROUP BY B.year
ORDER BY B.year;

结果:

year    Gold    Silver  Platinum
2010    2       1       2
2011    1       0       0
2013    1       0       0
2014    0       0       1
2015    0       1       0

sqlfiddle -> http://sqlfiddle.com/#!9/59893/3

关于php - MYSQL - 选择最小和最大年份并填补空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36855137/

相关文章:

php - 在php中递归搜索所有目录中的字符串数组

php - 使用 jquery 的 ajax post 安全吗?

javascript - 从 AJAX 请求返回 while 循环

mysql - 如何将form_dropdown id值添加到数据库? - 代码点火器

mysql - Update if exists else 插入,但具有非唯一列

php - Laravel Eloquent JOIN ON 多个条件

php - 如何配置 ctags 来索引 PHP namespace 及其别名?

javascript - 更改按钮值和颜色

mysql - 将日期/时间添加到 MySQL 表?

MySQL从多个表中插入一个表并按id过滤