如何从两个不同 MySQL 表中的两个变量绘制折线图

How to draw line chart from Two variables in two different MySQL tables

我是 php 的新手,正在学习如何绘制 MySQL 中两个不同 table 中两个不同温度值的折线图。我可以从一个 table 中获取数据并将其绘制在图表中,但我不知道如何从两个不同的 table 中获取两个温度值。

第一个table1: 身份证温度 1 20

第二个表2: 身份证温度 1 25

data.php代码:

<?php 
 $servername = "localhost";
 $database = "test";
 $username = "test";
 $password = "12345";

 $connect = mysqli_connect($servername, $username, $password, $database);
 if (!$connect) {
  die("Connection failed: " . mysqli_connect_error());
  }

$query = ("SELECT * FROM Table1 UNION SELECT * FROM Table2");
$result = mysqli_query($connect, $query);

$data = array(); 

if ($result->num_rows > 0) { 
 while ($row = $result->fetch_assoc()) { 

 array_push($data, [$row['time'], floatval($row['temp']), $row['time'], floatval($row['temp'])]); 
 }
 }
  echo json_encode($data);
  mysqli_close($connect);

?>

JS代码:

setInterval(function () {

  google.charts.load('current', {'packages':['corechart', 'line']});
  google.charts.setOnLoadCallback(drawLineColors);

  function drawLineColors() {

  var data = new google.visualization.DataTable(jsonData);

  data.addColumn('string', 'Date');
  data.addColumn('number', 'Temperature');
   
  data.addColumn('string', 'Date');
  data.addColumn('number', 'Temperature2');
   

var jsonData = $.ajax({
    url: "data.php",
    dataType: "json",
    async: false
    }).responseText;
    
var obj = JSON.parse(jsonData);

data.addRows(obj);

let rowIndex = data.getNumberOfRows() - 1; //gets the row index of last row
let lastTime = data.getValue(rowIndex, 0); //gets the first column
let lastTemp = data.getValue(rowIndex, 1); //gets second column

let rowIndex2 = data.getNumberOfRows() - 1; //gets the row index of last row
let lastTime2 = data.getValue(rowIndex, 0); //gets the first column
let lastTemp2 = data.getValue(rowIndex,1); //gets third column

console.log(` ${lastTemp}, ${lastTemp2}`);
 
    $(".TempStatus").html(lastTemp + " &deg;C");
    $(".Temp2Status").html(lastTemp2 + " &deg;C");

   var options = {
    hAxis: {
      title: 'Time'
    },
    vAxis: {
      title: 'Sensors Scale'
    },
    colors: ['#a52714', '#097138']
  };
  var chart = new  google.visualization.LineChart(document.getElementById('chart_div'));

  chart.draw(data, google.charts.Line.convertOptions(options));
   }
    }, 5000);

 

如何从两个 table 中获取两个温度值?

首先,让我们分别查询两个表。
然后合并响应的数据,Table1 & Table2...

<?php
  $servername = "localhost";
  $database = "test";
  $username = "test";
  $password = "12345";

  $connect = mysqli_connect($servername, $username, $password, $database);
  if (!$connect) {
    die("Connection failed: " . mysqli_connect_error());
  }

  $data = array(
    'Table1' => array(),
    'Table2' => array()
  );

  $query = ("SELECT * FROM Table1");
  $result = mysqli_query($connect, $query);
  if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
      array_push($data['Table1'], [$row['time'], floatval($row['temp'])]);
    }
  }

  $query = ("SELECT * FROM Table2");
  $result = mysqli_query($connect, $query);
  if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
      array_push($data['Table2'], [$row['time'], floatval($row['temp'])]);
    }
  }

  echo json_encode($data);
  mysqli_close($connect);
?>

绘制图表时,只能有一张x-axis。
所以我们需要在时间列上连接两个表。

但首先,google 图表只需要加载一次。
不是每次我们画图表。
所以我们将首先加载 google 个图表,然后再进行其他操作。

而且我们不知道具体需要多长时间才能获取数据并绘制图表。
我们将在第一次抽奖结束后使用 setTimeout,而不是 setInterval

google.charts.load('current', {
  packages: ['corechart']
}).then(function () {

  var options = {
    hAxis: {
      title: 'Time'
    },
    vAxis: {
      title: 'Sensors Scale'
    },
    colors: ['#a52714', '#097138']
  };

  var chart = new google.visualization.LineChart(document.getElementById('chart_div'));

  google.visualization.events.addListener(chart, 'ready', function () {
    setTimeout(drawLineColors, 5000);
  });

  drawLineColors();

  function drawLineColors() {
    var data1 = new google.visualization.DataTable();
    data1.addColumn('string', 'Date');
    data1.addColumn('number', 'Temperature');

    var data2 = new google.visualization.DataTable();
    data2.addColumn('string', 'Date');
    data2.addColumn('number', 'Temperature');

    $.ajax({
      url: 'data.php',
      dataType: 'json',
    }).done(function (jsonData) {
      data1.addRows(jsonData.Table1);
      data2.addRows(jsonData.Table2);

      var joinData = google.visualization.data.join(data1, data2, 'full', [[0, 0]], [1], [1]);

      var rowIndex = data1.getNumberOfRows() - 1;
      var lastTime = data1.getValue(rowIndex, 0);
      var lastTemp = data1.getValue(rowIndex, 1);
      var rowIndex2 = data2.getNumberOfRows() - 1;
      var lastTime2 = data2.getValue(rowIndex2, 0);
      var lastTemp2 = data2.getValue(rowIndex2, 1);
      $(".TempStatus").html(lastTemp + " &deg;C");
      $(".Temp2Status").html(lastTemp2 + " &deg;C");

      chart.draw(joinData, options);
    });
  }
});

其他注意事项...

  1. async: false on ajax 已弃用,请改用 done 回调。
  2. 不需要 google 图表中的 'line' 包,它用于 material 折线图。
    您使用的是 经典 折线图 --> google.visualization.LineChart
    material --> google.charts.Line
    同样,不需要转换经典图表的选项,
    删除 --> google.charts.Line.convertOptions