• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Mysqli dzinwe zachowanie oraz wyniki przy zapttaniu WHERE data >=now()-interval 1 day LIMIT 1

Object Storage Arubacloud
0 głosów
131 wizyt
pytanie zadane 10 września 2023 w SQL, bazy danych przez gatka84 Bywalec (2,150 p.)
edycja 10 września 2023 przez gatka84

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

3 odpowiedzi

+1 głos
odpowiedź 10 września 2023 przez VBService Ekspert (253,420 p.)

więc z całej doby jest 720 wpisów.

IMO więc chodzi o dane z przeszłości do daty aktualnej więc chyba znak <=

WHERE data <= now() - interval 1 day

 

1
komentarz 10 września 2023 przez gatka84 Bywalec (2,150 p.)
Dziękuję, wiedziałam, że gdzieś błąd był, ale tu "<=" nie brałam pod uwagę :)
komentarz 11 września 2023 przez gatka84 Bywalec (2,150 p.)

Jednak dalej coś nie tak, bo obecnie przy zapisie np

SELECT wh,data FROM `dom_czasowy` WHERE wh=(select min(wh)data from dom_czasowy) AND  data <= NOW()-interval 1 day  LIMIT 1;

 wyświetla z bazy niepoprzedni dzień

0.40 	2023-09-07 21:53:09

i tylko dla select min(wh) jeśli dam select max(wh) to nic nie pokazuje

natomiast jeśli dam jak poprzednio znak ">=" to przy zapisie

SELECT `wh`,data FROM `dom_czasowy` WHERE `wh`=(select min(`wh`)data from dom_czasowy) AND  data >= NOW()-interval 1 day;

nic nie pokaże dla  (select min(`wh`) ale jeśli będzie (select max(`wh`) to już

7.10 	2023-09-10 22:44:33

ale z dzisiaj.

Teraz już totalnie tego nie rozumiem, dlaczego takie dziwactwa się robią z min i max i to nie działa, gdzie zakładałam, że formuła jedna jest zapytania i tylko wybieram czy max czy min.

komentarz 11 września 2023 przez VBService Ekspert (253,420 p.)

Spróbuj zobaczyć co zwraca np. taki zapis
 

SELECT min(`wh`), `data` FROM `dom_czasowy`;
SELECT min(`wh`), `data` FROM `dom_czasowy` WHERE `data` >= now() - interval 1 day;
SELECT min(`wh`), `data` FROM `dom_czasowy` WHERE `data` = now() - interval 1 day;
SELECT min(`wh`), `data` FROM `dom_czasowy` WHERE `data` <= now() - interval 1 day;

analogicznie dla max

SELECT max(`wh`), `data` FROM `dom_czasowy`;
SELECT max(`wh`), `data` FROM `dom_czasowy` WHERE `data` >= now() - interval 1 day;

itd.

komentarz 11 września 2023 przez gatka84 Bywalec (2,150 p.)

Wykonałam, jak pisałeś i tak dla zapytań

SELECT `id`,min(`wh`), `data` FROM `dom_czasowy`; 
otrzymałam
89 	0.40 	2023-09-02 21:26:18

dla

SELECT `id`,min(`wh`), `data` FROM `dom_czasowy` WHERE `data` >= now() - interval 1 day; 
otrzymałam
690 	1.40 	2023-09-10 22:44:33

dla

SELECT `id`,min(`wh`), `data` FROM `dom_czasowy` WHERE `data` = now() - interval 1 day; 
otrzymałam
 NULL 	NULL 	NULL 

dla

SELECT `id`,min(`wh`), `data` FROM `dom_czasowy` WHERE `data` <= now() - interval 1 day; 
otrzymałam
89 	0.40 	2023-09-02 21:26:18

dla

SELECT `id`,max(`wh`), `data` FROM `dom_czasowy`; 
otrzymałam
89 	7.10 	2023-09-02 21:26:18

dla

SELECT `id`,max(`wh`), `data` FROM `dom_czasowy` WHERE `data` >= now() - interval 1 day; 
otzrzymałam
690 	7.10 	2023-09-10 22:44:33

dla

SELECT `id`,max(`wh`), `data` FROM `dom_czasowy` WHERE `data` = now() - interval 1 day; 
otzrymałam
 NULL 	NULL 	NULL 

dla

SELECT `id`,max(`wh`), `data` FROM `dom_czasowy` WHERE `data` <= now() - interval 1 day; 
otrzymałam
89 	47.00 	2023-09-02 21:26:18

i z tego wynika, że porawne zapytanie powinno być

WHERE `data` >= now() - interval 1 day

??

komentarz 11 września 2023 przez gatka84 Bywalec (2,150 p.)

i jeszcze jedno dziwne zachowanie mam tzn kiedy podam w bazie takie zapytanie:

SELECT max(`napiecie`), `data` FROM `dom_czasowy` WHERE `data` >= now() - interval 1 day LIMIT 1;
SELECT min(`napiecie`), `data` FROM `dom_czasowy` WHERE `data` >= now() - interval 1 day LIMIT 1;
SELECT max(`ampery`),`data` FROM `dom_czasowy` WHERE `data` >= now() - interval 1 day LIMIT 1;
SELECT min(`ampery`),`data` FROM `dom_czasowy` WHERE `data` >= now() - interval 1 day LIMIT 1;
SELECT max(`wh`),`data` FROM `dom_czasowy` WHERE `data` >= now() - interval 1 day LIMIT 1;
SELECT min(`wh`),`data` FROM `dom_czasowy` WHERE `data` >= now() - interval 1 day LIMIT 1;

otrzymam

236.10 	2023-09-10 22:44:33;
229.40 	2023-09-10 22:44:33;
0.50 	2023-09-10 22:44:33;
0.50 	2023-09-10 22:44:33;
7.10 	2023-09-10 22:44:33;
1.40 	2023-09-10 22:44:33;

i po mimo, różnych wyników wszystkie są z tą samą datą
 

0 głosów
odpowiedź 10 września 2023 przez gatka84 Bywalec (2,150 p.)

ok na ostatnie pytanie sama sobie odpowiem smiley dla innych, którzy by szukali tzn jeśli w wyniku zapytania jest "nan", trzeba sprawdzić bazę danych, bo jeśli w przedziale szukanych wyników któraś z komórek ma "nan" to zawsze wynik z zapytania wyniesie "nan" jedynie nie wiem czemu przy min pokazał poprawną wartość a przy max nan.

0 głosów
odpowiedź 10 września 2023 przez gatka84 Bywalec (2,150 p.)

Dalej próbując nie umiem zrozumieć, dla czego lub w jaki sposób wykonać zapytanie, bo jeśli daję tak

 select * from dom_czasowy where  wh=(select max(wh)data from dom_czasowy)

to otrzymam


Full texts
	id 	  napiecie  ampery  wilgotnosc 	   temp 	 pf 	  hz 	wh 	   data 	
	177    236.90 	0.50 	 64.90 	       24.70 	0.76 	94.00 	47.00 	2023-09-03 00:23:33

i teraz chcę, żeby wybrał max. z żądanego przedziału więc daję

select * from dom_czasowy where  wh=(select max(wh)data from dom_czasowy) and data >=now()-interval 1 day

i tu problem, bo nic nie wybiera i nie wiem, jak powinno brzmieć zapytanie, żeby przedział z zakresu daty był z dnia wczorajszego i z tego wybrał max z kolumny wh.

Podobne pytania

0 głosów
1 odpowiedź 608 wizyt
0 głosów
1 odpowiedź 372 wizyt
pytanie zadane 22 stycznia 2023 w SQL, bazy danych przez gatka84 Bywalec (2,150 p.)
0 głosów
1 odpowiedź 266 wizyt
pytanie zadane 22 sierpnia 2016 w SQL, bazy danych przez Alterwar Dyskutant (7,650 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...