[英]MYSQL - Select MIN and MAX year and fill the gaps
我想在我的數據庫中使用 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 年的 Silver 和 Platinum,我想將 Silver 和 Platinum 放在列表中,但 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.