如何获取第X个最新的SQL查询

时间:2015-11-18 01:47:16

标签: javascript php mysql

我正在使用谷歌图表API来创建图表。我有48个数据点,一天每30分钟一个点。我的php脚本每15秒运行一次,并将计算出的比特币价格保存到数据库中。现在要从数据库中获取最新价格,我正在使用此代码。

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT priceLBTC FROM prices ORDER BY id DESC LIMIT 1";
$result = $conn->query($sql);
$bitcoinPrice = 0;
if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        $bitcoinPrice = round($row["priceLBTC"], 2);
    }
} else {
    echo "0 results";
}

    $sql2 = "SELECT priceLBTC FROM prices ORDER BY id DESC LIMIT 5760";
    $result2 = $conn->query($sql);
    $bitcoinPriceArr = array();
    if ($result->num_rows > 0) {
        // output data of each row
        $i=-1;
        while($row = $result->fetch_assoc()) {
            $i++;
            if ($i%120) continue;

            $bitcoinPriceArr[] = round($row["priceLBTC"], 2);
        }
    } else {
        echo "0 results";
    }


$conn->close();
?>

因此图表上的第一个数据点应该是最近的价格,即$ bitcoinPrice,然后47个跟随的数据点应该是彼此之前的120行。例如:下一个数据点的id是((最近价格的行) - 120))。 (php脚本每15秒运行一次,每分钟4次* 30分钟=每30分钟120次)

是否有更简单的方法来获取所有数据并将其放入图表而不创建其他47个变量并单独查询它们?

这是相关的谷歌图表javascript

function drawAxisTickColors() {
      var data = new google.visualization.DataTable();
      data.addColumn('number', 'X');
      data.addColumn('number', 'Price');

            data.addRows([
    [0, 0],    [1, 10],   [2, <?php echo $bitcoinPriceArr[0]; ?>],  [3, 17],   [4, 18],  [5, 9],
    [6, 11],   [7, 27],  [8, 33],  [9, 40],  [10, 32], [11, 35], [12, 35], [13, 35], [14, 35], [15, 35], [16, 35], [17, 35], [18, 35], [19, 35], [20, 35], [21, 35], [22, 35], [23, 35],
    [24, 5], [25, 5], [26, 5], [27, 5], [28, 5], [29, 5], [30, 5], [31, 5], [32, 5], [33, 5], [34, 5], [35, 5], [36, 5], [37, 5], [38, 5], [39, 5], [40, 31], [41, 320], [42, 315], [43, 305],
    [44, 299], [45, 309], [46, 300], [47, <?php echo $bitcoinPrice; ?>]
  ]);

1 个答案:

答案 0 :(得分:1)

请在发布问题之前查看论坛。

这基本上在这里解释:How do you select every n-th row from mysql

应用于您的用例,如下所示:

SELECT * 
FROM ( 
    SELECT 
        @row := @row +1 AS rownum, priceLBTC 
    FROM ( 
        SELECT @row :=0) r, prices 
    ) ranked 
WHERE rownum % [120] = 1

更容易 - 甚至可能更高效 - 的方式就是获取所有数据,并选择PHP所需的点数。

$sql = "SELECT priceLBTC FROM prices ORDER BY id DESC LIMIT 5760";
$result = $conn->query($sql);
$bitcoinPrice = array();
if ($result->num_rows > 0) {
    // output data of each row
    $i=-1;
    while($row = $result->fetch_assoc()) {
        $i++;
        if ($i%120) continue;

        $bitcoinPrice[] = round($row["priceLBTC"], 2);
    }
} else {
    echo "0 results";
}


$conn->close();

会发生什么:

  • 限制设置为120次请求的48次(5760次:24小时的最大值)
  • $bitcoinPrice应该是array,因为它需要保留几个值
  • 第一次迭代后
  • $i=0
  • 从那时起,只选择$i没有的数据点 除以120后的余数

更好的方法是通过mysqli::fetch_all立即获取所有查询结果,并通过仅获取每第120个条目来构建$bitcoinPrice数组。这样,您就不必循环访问119个数据点,只是为了得到您需要的数据点。

添加

使用json_encode($bitcoinPriceArr)将php变量转换为javscript中可用的内容。如果你在javascript assignemnt中回显结果,你将得到一个javascript数组:

var bitcoinPrizes = <?php echo json_encode($bitcoinPriceArr); ?>;

通过它你可以建立你的图表:

var rows=[];

for (var i in bitcoinPrizes ){
    rows.push([i, bitcoinPrizes [i]]);
}

data.addRows($rows);

我认为你也可以这样做:

for (var i in bitcoinPrizes ){
    data.addRows([[i, bitcoinPrizes [i]]);
}

但我并不完全确定。

请注意,这不是让你的整个任务整理和解决的地方。聘请开发人员。 如果您有特定问题或遇到具体问题,可以在此处寻求帮助。 但是,您仍然需要学习所使用的语言和技术的基础知识。