MySQL nejvyšší hodnota v posledních n řádcích

kajka

MySQL nejvyšší hodnota v posledních n řádcích
« kdy: 18. 04. 2016, 22:20:46 »
Mám MySQL databázi o tisících řádcích, kam ukládám venkovní teplotu. V databázi jsou sloupce: DATETIME a 64000005E5CBCD28 (to je id senzoru a takto to do databáze ukládá program, který nedokáži upravit) a potřebuji dát dohromady příkaz, který najde nejvyšší hodnotu z posledních 1000 záznamů například za poslední den. Můj návrh nefunguje, tak potřebuji nakopnout správným směrem. Ještě dodám, že to je v php.

Kód: [Vybrat]
$sql="SELECT DATETIME, MAX (`64000005E5CBCD28`) FROM teplota GROUP BY DATETIME DESC LIMIT 1000";
a zde bych očekával, že se mi zobrazí datum, čas a teplota

Kód: [Vybrat]
echo $row['DATETIME']. $row['64000005E5CBCD28']. "<br />" ;
ovšem na stránce se vypíše pouze Notice: Trying to get property of non-object
« Poslední změna: 18. 04. 2016, 23:15:42 od Petr Krčmář »


Kit

Re:MYSQL nejvyšší hodnota v posledních n řádcích
« Odpověď #1 kdy: 18. 04. 2016, 22:33:59 »
Místo "GROUP BY" patří "ORDER BY".

Re:MYSQL nejvyšší hodnota v posledních n řádcích
« Odpověď #2 kdy: 18. 04. 2016, 22:44:18 »
Pokud jsou v tabulce teplota sloupce id, datetime a teplota a chcete zjistit nejvyšší teplotu pro zařízení s id = '64000005E5CBCD28' z posledního 1000 měření:

Kód: [Vybrat]
SELECT MAX(teplota) FROM (SELECT teplota FROM teplota WHERE id = '64000005E5CBCD28' ORDER BY datetime DESC LIMIT 1000)

Kit

Re:MYSQL nejvyšší hodnota v posledních n řádcích
« Odpověď #3 kdy: 18. 04. 2016, 22:51:32 »
Kód: [Vybrat]
SELECT DATETIME, t1 FROM (
    SELECT DATETIME, `64000005E5CBCD28` AS t1
        FROM teplota ORDER BY DATETIME DESC LIMIT 1000
) ORDER BY t1 DESC LIMIT 1;

kajka

Re:MYSQL nejvyšší hodnota v posledních n řádcích
« Odpověď #4 kdy: 19. 04. 2016, 18:04:11 »
Pokud jsou v tabulce teplota sloupce id, datetime a teplota a chcete zjistit nejvyšší teplotu pro zařízení s id = '64000005E5CBCD28' z posledního 1000 měření:


V tabulce jsou sloupce pouze datetime a 64000005E5CBCD28 (id senzoru bylo myšleno jeho id z výroby, nemá to nic společného s id v databázi-pokud by to nějak pomohlo, mohu sloupec id přidat)

Ale žádná z variant zápisu nefunguje.


Re:MYSQL nejvyšší hodnota v posledních n řádcích
« Odpověď #5 kdy: 19. 04. 2016, 21:01:54 »
V tabulce jsou sloupce pouze datetime a 64000005E5CBCD28 (id senzoru bylo myšleno jeho id z výroby, nemá to nic společného s id v databázi-pokud by to nějak pomohlo, mohu sloupec id přidat)

Ale žádná z variant zápisu nefunguje.
A co v té tabulce tedy vlastně chcete najít? Datum a čas posledního zápisu zařízení s nějakým ID? To by bylo takhle:

Kód: [Vybrat]
SELECT MAX(DATETIME) FROM teplota WHERE id = '64000005E5CBCD28'
Tam ale zase nikde nefiguruje těch vašich tisíc záznamů…

Taky mi není jasné, proč se ta tabulka jmenuje teplota, když v ní žádná teplota není…

Zkusím to ještě jednou:
najde nejvyšší hodnotu
Nejvyšší hodnotu čeho?

z posledních 1000 záznamů například za poslední den
Tak z posledních 1000 záznamů, nebo za poslední den? Nebo chcete vybrat nějaký den, z něj vzít 1000 nejmladších záznamů a mezi nimi hledat?

zde bych očekával, že se mi zobrazí datum, čas a teplota
Když v té tabulce nemáte teplotu uloženou, rozhodně se vám nepodaří ji z ní načíst.

gl

Re:MySQL nejvyšší hodnota v posledních n řádcích
« Odpověď #6 kdy: 19. 04. 2016, 23:11:49 »
Kitova odpověď je spráně.  Tu chybu "Notice: Trying to get property of non-object" nejspíš způsobuje něco jiného. Mohl bys poslat větší část kódu?

kajka

Re:MYSQL nejvyšší hodnota v posledních n řádcích
« Odpověď #7 kdy: 20. 04. 2016, 11:23:06 »
Citace
A co v té tabulce tedy vlastně chcete najít?
Taky mi není jasné, proč se ta tabulka jmenuje teplota, když v ní žádná teplota není…
A najít v ní chci nejvyšší teplotu za posledních 1000 měření. Zde je již uložena teplota např. 22.56

Tabulka se jmenuje teplota, protože v ní je teplota uložena je, ale pod sloupcem s názvem 64000005E5CBCD28, v tomto sloupci je uložena teplota. (tenhle název je kvůli tomu, že mně do databáze tyto hodnoty zasílá program, ve kterém nedokáži přepsat, aby se to ukládalo pod normálnějím názvem)

Citace
Nejvyšší hodnotu čeho?
Nejvyšší hodnotu ve sloupci 64000005E5CBCD28 za posledních 1000 měření.
Citace
Tak z posledních 1000 záznamů, nebo za poslední den? Nebo chcete vybrat nějaký den, z něj vzít 1000 nejmladších záznamů a mezi nimi hledat?
Posledních 1000 záznamů. Ale asi opravdu bude problém někde v jiné části

kajka

Re:MySQL nejvyšší hodnota v posledních n řádcích
« Odpověď #8 kdy: 20. 04. 2016, 17:32:59 »
Kód: [Vybrat]
$sql="SELECT DATETIME, t1 FROM (SELECT DATETIME, `64000005E5CBCD28` AS t1 FROM teplota ORDER BY DATETIME DESC LIMIT 1000) ORDER BY t1 DESC LIMIT 1;";
                         
$result = $conn->query($sql);

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

       echo $row['DATETIME']. " ".$row['64000005E5CBCD28']. "<br />" ;
      }
      }

stanono

Re:MySQL nejvyšší hodnota v posledních n řádcích
« Odpověď #9 kdy: 20. 04. 2016, 18:05:18 »
Problematické je použití DATETIME v dotazu, jelikož je to i název datového typu - je třeba použít obrácený apostrof. Alias t1000 (nebo jiný) musí být použit v dotazu, jinak MySQL vyhodí chybu "Every derived table must have its own alias".

Dotaz je otestován na popsané tabulce a je funkční :):
Kód: [Vybrat]
SELECT `DATETIME`, MAX(`64000005E5CBCD28`) FROM (SELECT * FROM `teplota` ORDER BY `DATETIME` DESC LIMIT 1000) t1000;

akoze

Re:MySQL nejvyšší hodnota v posledních n řádcích
« Odpověď #10 kdy: 20. 04. 2016, 21:53:59 »
off topic, mozem sa nesmelo spytat na zdroj dat resp. program ktory to uklada zo snimacov do DB ?
len aby sme vedeli comu sa vyhnut. nazov stlpca rovnaky ako nazov datoveho typu, no budiz, ale stlpce pre kazdy snimac ? predpokladam, ze ak by snimacov bolo 5, tak podla autora by tam bolo 5 stlpcov ... co je samozrejme zle.

gl

Re:MySQL nejvyšší hodnota v posledních n řádcích
« Odpověď #11 kdy: 20. 04. 2016, 23:28:23 »
Kód: [Vybrat]
$sql="SELECT DATETIME, t1 FROM (SELECT DATETIME, `64000005E5CBCD28` AS t1 FROM teplota ORDER BY DATETIME DESC LIMIT 1000) ORDER BY t1 DESC LIMIT 1;";
                         
$result = $conn->query($sql);

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

       echo $row['DATETIME']. " ".$row['64000005E5CBCD28']. "<br />" ;
      }
      }

Kód: [Vybrat]
$sql="SELECT `DATETIME`, t1 FROM (SELECT `DATETIME`, `64000005E5CBCD28` AS t1 FROM teplota ORDER BY `DATETIME` DESC LIMIT 1000) ORDER BY t1 DESC LIMIT 1;";
                         
$result = $conn->query($sql);

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

       echo $row['DATETIME']. " ".$row['t1']. "<br />" ;
      }
      }

jeste je mozne, ze neni spravne vytvoreny $conn.

kajka

Re:MySQL nejvyšší hodnota v posledních n řádcích
« Odpověď #12 kdy: 21. 04. 2016, 07:34:04 »
off topic, mozem sa nesmelo spytat na zdroj dat resp. program ktory to uklada zo snimacov do DB ?

Je to LogTemp. Jen se zeptám, co je špatně na tom, že má každý snímač vlastní sloupec resp. jak to jde udělat jinak? V tomto se moc neorientuji, tento směr mám jen jako hobby a tohle měření teploty, nějaké grafy atd. byl takový můj zimní projekt.  :D

Re:MySQL nejvyšší hodnota v posledních n řádcích
« Odpověď #13 kdy: 21. 04. 2016, 08:16:29 »
Je to LogTemp. Jen se zeptám, co je špatně na tom, že má každý snímač vlastní sloupec resp. jak to jde udělat jinak?
Předpokládá to, že budete měřit ze všech snímačů najednou, a že ta měření na jednotlivých snímačích mají mezi sebou nějaký vztah. Když přidáte další snímač, musíte měnit tabulku a aplikaci, když snímač odeberete, zůstane vám ten sloupec navždy v databázi (abyste nepřišel o historická data). Správně je mít tabulku, kde bude v jednom řádku datum a čas měření, snímač a měřená hodnota, a vedle ní případně tabulku se seznamem snímačů.

Už jenom když budete nad současnou tabulkou chtít udělat třeba dotaz na nejvyšší naměřenou teplotu po dnech (bez ohledu na snímač), bude z toho ošklivý dotaz závislý na konkrétní sadě snímačů.

Skřetík

Re:MySQL nejvyšší hodnota v posledních n řádcích
« Odpověď #14 kdy: 21. 04. 2016, 12:59:46 »
Problém je v tom echo. Pokud napíšete
$sql="SELECT `DATETIME`, `t1` FROM (SELECT `DATETIME`, `64000005E5CBCD28` AS t1 FROM teplota ORDER BY `DATETIME` DESC LIMIT 1000) ORDER BY t1 DESC LIMIT 1;";

pak máte logicky výsledek v $row['DATETIME'] a $row['t1']

Pokud tam chcete MAX(`DATETIME`) bez aliasu, dost dobře nevíte jak se výsledek bude jmenovat (nebo je potřeba zaaliasovat pomocí MAX(`DATETIME`) AS maxTemp nebo něco podobného.