简体   繁体   中英

How to work with two large sets of data from one mySQL database table in PHP?

I'm attempting to work with two sets of data from the same mySQL table in a PHP script. The idea is data is scraped from an API and into a database hourly. A second script then pulls the information out of the database and displays a rolling 6-hour delta.

I've run into a bit of a problem trying to create the delta from the two datasets. I need to run two mySQL queries to get the data I need (current and from 6 hours ago), but can't really think of a way to get the script to work without including the queries inside the loops that output each entry (These can run up to a couple of hundred times, and I don't think having that many mySQL queries running would be good?)

This is what I have so far:

//select the system table and pulls data acquired within the last hour.
$sql = "SELECT system, vp, vpthreshold, owner, time FROM SysData WHERE time > DATE_SUB(NOW(),INTERVAL 1 HOUR)";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {

    //Calculates contested percentage
    $vpthreshold = $row["vpthreshold"]; 
    $vp = $row["vp"];   
    $currentcontested = $vp/$vpthreshold*100;

    //Catches potential divide by zeroes, echos system is stable.
    if ($vp == 0.0){
        echo $row["system"] . " " . "is Stable<br>";
    }
    //else output contested percentage with system name in readable format.
    else{

        echo $row["system"] . " " . "{$currentcontested}%" . "<br>";
    }
} 
}

There's a broadly identical statement that pulls and echos the second set of information underneath this. How can I get these two sets together so I can work with them? Very new to PHP and learning on the fly here.

You can look into nested queries. Something like the following:

SELECT (data_now.somevalue - data_prev.somevalue) as deltavalue FROM
(
    (your first select statement) as data_now, 
    (your 6 hours ago select statement) as data_prev
);

This lets you select data from other select statements all in one go. The 2 inner "select statements" you should replace with your respective queries. The results will be put temporarily into data_now and data_prev. You can then use these as normal tables in the outer select statement.

EDIT: To be more specific to what you want, here is an updated example:

SELECT (data_now.vp/data_now.vpthreshold - data_prev.vp/data_prev.vpthreshold) as deltavalue FROM
(
    (SELECT system, vp, vpthreshold, owner, time FROM SysData WHERE time > DATE_SUB(NOW(),INTERVAL 1 HOUR)) as data_now, 
    (your 6 hours ago select statement) as data_prev
);

In your PHP code remember to reference the result as:

$row["deltavalue"]

or whatever you put after "as" in the outer SELECT.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM