Ahoj všem,
prosím si o radu zkušenější z vás, kteří mají mozek na to si problém v hlavě vybavit a provést v něm emulaci mého problému. :-)
Cíl: Vytvořit SQL dotaz, který rozezná, zda poslední přidaný záznam v tabulce je starší než 3 hodiny.
Chci v PHP udělat skript pro CRON démona spouštěný jako pravidelná úloha. Řekl jsem si, že to chci jednoduché, aby veškěrou práci dělal SQL dotaz a na straně PHP už bylo jen pár řádků.
Problém je v tom, že se mi SQL dotaz nedaří vymodelovat tak, aby fungoval jak potřebuji.
Cílem: Vzít poslední záznam v databází (pravděpodobně nutno řešit nějak takto): SELECT *
FROM table ORDER BY ID DESC LIMIT 1 a nad tímto selectem udělat další select, který se pokusí z toho posledního přidaného záznamu vyselektovat záznam starší 3h. Ten by by mohl vypadat takhle: SELECT datum,cas FROM table WHERE cas < (NOW() - INTERVAL 160 MINUTE) ORDER BY cas DESC Dotaz, který potřebuji vymodelovat by byl kombinací výše uvedených dotazů ale v pořadí, že napřed musí proběhnout selekce posledního záznamu v tabulce a potom až WHERE klauzule. Výsledkem SQL dotazu bude buď prázdná množina (v případě, že poslední záznam v databázi nebyl přidán před více než 3 hodinami) a nebo množina s jedním prvkem (v případě, že poslední záznam byl přidán před více než třemi hodinami).
Představte si, že sbírám do databáze data ze senzoru, např. teplotu a chci aby mě automaticky spouštěná úloha upozornila např. e-mailem na to, že do databáze nebyla za poslední 3 hodiny přidána žádná nová hodnota (výsledek SQL dotazu bude jeden záznam = podařilo se nalézt poslední záznam, který je zároveň starší než tři hodiny). Což pro mě znamená např. jít restartovat zařízení se senzorem, zkontrolovat připojení k internetu apod.
Můj dotaz vypadá takto, ale nefunguje, měl byste pro mě prosím někdo nějaký nápad?
SELECT datum,cas
FROM (
SELECT *
FROM table
ORDER BY ID DESC LIMIT 1
) AS lastrow
WHERE cas < (NOW() - INTERVAL 180 MINUTE)
ORDER BY cas DESC
Nešlo by případně využít klauzule HAVING nebo konstrukcí ALL/ANY?
SELECT column_name(s)
FROM table_name
WHERE column_name operator ALL
(SELECT column_name FROM table_name WHERE condition);