Witajcie napotkałam na dość dla mnie frustrujący problem mianowicie chce zapisywać do bazy max i mni z kolumn z poprzedniego dnia do innej tabeli i teraz natrafiłam na kilka problemów tj:
1- czy da się to zapisać w jednym zapytaniu, czy lepiej w kilku jak mam obecnie,
2 - mam problem z datą tj chcę mieć informację kiedy był dokładnie max, a kiedy min,
mam tak
function ReadingsMaxMin() {
global $servername, $username, $password, $dbname;
// Create connection
$con = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($con->connect_error) {
die("Connection failed: " . $con->connect_error);
}
$sql = "SELECT `napiecie_Max`, `napiecie_Max_data`, `ampery_Max`, `ampery_Max_data`, `Wh_Max`, `Wh_Max_data` FROM `dom_czasowyMaxMin` WHERE data >=now()-interval 1 day" ;
$results = mysqli_query($con, $sql);
if (mysqli_num_rows($results) > 0) {
}
if (mysqli_num_rows($results) == 0) {
$sql1 = "SELECT MAX(napiecie), data FROM `dom_czasowy` WHERE data >=now()-interval 1 day LIMIT 1";
$results1 = mysqli_query($con, $sql1);
if (mysqli_num_rows($results1) > 0) {
$row1 = mysqli_fetch_array($results1);
$napiecie_Max = $row1['MAX(napiecie)'];
$napiecie_Max_data = $row1['data'];
}
$sql2 = "SELECT MIN(napiecie), data FROM `dom_czasowy` WHERE data >=now()-interval 1 day LIMIT 1";
$results2 = mysqli_query($con, $sql2);
if (mysqli_num_rows($results2) > 0) {
$row2 = mysqli_fetch_array($results2);
$napiecie_Min = $row2['MIN(napiecie)'];
$napiecie_Min_data = $row2['data'];
}
$sql3 = "SELECT MAX(ampery),data FROM `dom_czasowy` WHERE data >=now()-interval 1 day LIMIT 1";
$results3 = mysqli_query($con, $sql3);
if (mysqli_num_rows($results3) > 0) {
$row3 = mysqli_fetch_array($results3);
$ampery_Max= $row3['MAX(ampery)'];
$ampery_Max_data = $row3['data'];
}
$sql4 = "SELECT MIN(ampery),data FROM `dom_czasowy` WHERE data >=now()-interval 1 day LIMIT 1";
$results4 = mysqli_query($con, $sql4);
if (mysqli_num_rows($results4) > 0) {
$row4 = mysqli_fetch_array($results4);
$ampery_Min= $row4['MIN(ampery)'];
$ampery_Min_data = $row4['data'];
}
$sql5 = "SELECT MAX(Wh),data FROM `dom_czasowy` WHERE data >=now()-interval 1 day LIMIT 1";
$results5 = mysqli_query($con, $sql5);
if (mysqli_num_rows($results5) > 0) {
$row5 = mysqli_fetch_array($results5);
$Wh_Max= $row5['MAX(Wh)'];
$Wh_Max_data = $row5['data'];
}
$sql6 = "SELECT MIN(Wh),data FROM `dom_czasowy` WHERE data >=now()-interval 1 day LIMIT 1";
$results6 = mysqli_query($con, $sql6);
if (mysqli_num_rows($results6) > 0) {
$row6 = mysqli_fetch_array($results6);
$Wh_Min= $row6['MIN(Wh)'];
$Wh_Min_data = $row6['data'];
}
$sql7 = "INSERT INTO dom_czasowyMaxMin (`napiecie_Max`, `napiecie_Max_data`, `napiecie_Min`, `napiecie_Min_data`, `ampery_Max`, `ampery_Max_data`, `ampery_Min`, `ampery_Min_data`, `Wh_Max`, `Wh_Max_data`, `Wh_Min`, `Wh_Min_data`)
VALUES ('" . $napiecie_Max . "', '" . $napiecie_Max_data . "', '" . $napiecie_Min . "', '" . $napiecie_Min_data . "', '" . $ampery_Max . "', '" . $ampery_Max_data . "', '" . $ampery_Min . "', '" . $ampery_Min_data . "', '" . $Wh_Max . "', '" . $Wh_Max_data . "', '" . $Wh_Min . "', '" . $Wh_Min_data . "')";
if ($con->query($sql7) === TRUE) {
return "New record created successfully";
}
else {
return "Error: " . $sql7 . "<br>" . $con->error;
}
}
$con->close();
}
i przy takim zapytaniu dostałam wpis do bazy tak
INSERT INTO `dom_czasowyMaxMin` (`id`, `napiecie_Max`, `napiecie_Max_data`, `napiecie_Min`, `napiecie_Min_data`, `ampery_Max`, `ampery_Max_data`, `ampery_Min`, `ampery_Min_data`, `Wh_Max`, `Wh_Max_data`, `Wh_Min`, `Wh_Min_data`, `data`) VALUES
(3, '237.40', '2023-09-09 20:57:22', '231.30', '2023-09-09 20:57:22', '0.50', '2023-09-09 20:57:22', '0.50', '2023-09-09 20:57:22', '2.40', '2023-09-09 20:57:22', '0.50', '2023-09-09 20:57:22', '2023-09-10 14:08:20');
-
i jak widać z powyższych wszystkie wpisy, mają tę samą datę. Jeśli chodzi o samą bazę to dane z czujników, są zapisywane co 2 min do bazy, więc z całej doby jest 720 wpisów.
Testowałam jeszcze takie zapytanie
SELECT napiecie,data FROM `dom_czasowy` WHERE napiecie=(select max(napiecie)data from dom_czasowy) AND data >=now()-interval 1 day LIMIT 1;
ale z niewiadomych dla mnie powodów nie działa to dla wszystkich kolumn np dla Wh nie działa tzn przy takim zapytaniu
SELECT Wh,data FROM `dom_czasowy` WHERE Wh=(select min(Wh)data from dom_czasowy) AND data >=now()-interval 1 day LIMIT 1;
nic nie pokaże ale jeśli wykonam
SELECT MIN(Wh), data FROM `dom_czasowy` WHERE data >= (now()-interval 1 day);
otrzymam
0.50 2023-09-09 20:57:22
z MAX tak samo i nie wiem, dlaczego dla jednych pokazuje, a dla innych w tej samej tabeli nie będę, wdzięczna za podpowiedz lub wytłumaczenie i wskazanie jak to powinnam robić, bo gdzieś popełniam błąd lub całkowicie źle do tego podeszłam.
Natrafiłam jeszcze na jeden problem i też nie wiem co go powoduje mianowicie przy zapytaniu
SELECT id, Min(napiecie) FROM `dom_czasowy` WHERE data >=now()-interval 1 day
pokaże
203 231.30
ale kiedy dam
SELECT id, Max(napiecie) FROM `dom_czasowy` WHERE data >=now()-interval 1 day
dostaje
203 nan
i nie wiem co jest przyczyną kiedy dam
SELECT id, napiecie FROM `dom_czasowy` WHERE data >=now()-interval 1 day
otrzymam
e
Edit Edit Copy Copy Delete Delete 203 231.40
Edit Edit Copy Copy Delete Delete 204 231.30
Edit Edit Copy Copy Delete Delete 205 233.60
Edit Edit Copy Copy Delete Delete 206 233.90
Edit Edit Copy Copy Delete Delete 207 233.80
Edit Edit Copy Copy Delete Delete 208 234.50
Edit Edit Copy Copy Delete Delete 209 234.70
Edit Edit Copy Copy Delete Delete 210 234.70
Edit Edit Copy Copy Delete Delete 211 234.30
Edit Edit Copy Copy Delete Delete 212 233.60
Edit Edit Copy Copy Delete Delete 213 233.40
Edit Edit Copy Copy Delete Delete 214 234.20
Edit Edit Copy Copy Delete Delete 215 234.10
Edit Edit Copy Copy Delete Delete 216 234.40
Edit Edit Copy Copy Delete Delete 217 234.20
Edit Edit Copy Copy Delete Delete 218 234.30
Edit Edit Copy Copy Delete Delete 219 234.20
Edit Edit Copy Copy Delete Delete 220 234.90
Edit Edit Copy Copy Delete Delete 221 234.90
Edit Edit Copy Copy Delete Delete 222 235.50
Edit Edit Copy Copy Delete Delete 223 235.20
Edit Edit Copy Copy Delete Delete 224 235.30
Edit Edit Copy Copy Delete Delete 225 235.80
Edit Edit Copy Copy Delete Delete 226 235.40
Edit Edit Copy Copy Delete Delete 227 235.10
i mam wartości, które baza powinna wskazać jako max i mni co może powodować to dziwne zachowanie