Autor Zpráva
jtfcobra
Profil
První a poslední záznam každého dne? vypsat najednou

Příklad
10:00 hodnota XXX // Zacatek
22:00 hodnota XXX // Konec

(jinak mezitim je nezpocet zaznamu)




$mesic=  $_GET["mesic"];
$rok=$_GET["rok"];
$den=$_GET["den"];
if ($rok=='15') {$rok='2015';};
if ($rok=='16') {$rok='2016';};
if ($rok=='17') {$rok='2017';};
if ($rok=='18') {$rok='2018';};
if ($_GET["mesic"]=='') {$mesic=Date("m");};
if ($_GET["rok"]=='') {$rok='20'.Date("y");}; 
if ($_GET["den"]=='') {$den=Date("d");};
$db = mysql_connect($hostname_test, $username_test, $password_test);
mysql_select_db($database_test,$db);
$vybranyzarizeni=  $_GET["zkratka"];
$nastaveni='0';
$result = mysql_query("SELECT * FROM d136223_pilat.data where MONTH(datum) ='$mesic' and zapinani='$nastaveni' and YEAR(datum) = '$rok' and zarizeni='$vybranyzarizeni' order by cas asc",$db);
Kajman
Profil
Mohlo by jít něco jako

SELECT   d.*
FROM     (SELECT   datum,
                   Min(cas) mincas,
                   Max(cas) maxcas
          FROM     d136223_pilat.data dm
          WHERE    datum BETWEEN '2016-07-01' AND '2016-07-31'
                   AND zapinani=1
                   AND zarizeni='ZKRATKA'
          GROUP BY datum) minmax
JOIN     d136223_pilat.data d
ON       d.datum=minmax.datum
         AND d.cas IN (minmax.mincas,
                       minmax.maxcas)
WHERE    d.zapinani=1
         AND d.zarizeni='ZKRATKA'
ORDER BY datum,
         cas

A php kód máte náchylný na sql injection.
smitka
Profil
Pokud se záznamy vkládají postupně a zvyšuje se jim nějaké ID, tak jej šlo využít:

SELECT * FROM <tabulka> WHERE <id> in ((SELECT MAX(<id>) FROM <tabulka> WHERE <datum> BETWEEN 'yyyy-mm-dd' AND 'yyyy-mm-dd'), (SELECT MIN(<id>) FROM <tabulka> WHERE <datum> BETWEEN 'yyyy-mm-dd' AND 'yyyy-mm-dd'))

Pokud jistota s ID není, tak lze použít řazení:

SELECT * FROM <tabulka> WHERE <id> in ((SELECT <id> FROM <tabulka> WHERE <datum> BETWEEN 'yyyy-mm-dd' AND 'yyyy-mm-dd' ORDER BY <datum> DESC LIMIT 1), (SELECT <id> FROM <tabulka> WHERE <datum> BETWEEN 'yyyy-mm-dd' AND 'yyyy-mm-dd' ORDER BY <datum> ASC LIMIT 1))

Na sloupci s datumem by měl být index, aby se s ním rychleji pracovalo.
Kajman
Profil
smitka:

Pokud by se hledalo min a max na celém intervalu, tak přece stačí dva dotazy s order by a limit. Ty se dají spojit unionem a poddotazy netřeba.

Přišlo mi, že v měsíci hledá min a max pro každý den.
smitka
Profil
Kajman:

S tím unionem máš pravdu, já ho nerad používám, tak sem si na něj ani nevzpomněl :-)

Pokud je cílem najednou vypsat min a max pro všechny dny najednou, tak se to docela komplikuje a osobně bych to řešil až na aplikační úrovni, ale si by také šlo použít řešení s unionem - groupnout maxima dle dne a spojit to s minimama dle dne.
Keeehi
Profil
smitka:
A nebo bez UNIONU tak, jak to napsal Kajman v [#2].
jtfcobra
Profil
Kdyz zkousim tohle tak to nejde

<?php
$mesic=  $_GET["mesic"];
$rok=$_GET["rok"];
$den=$_GET["den"];
if ($rok=='15') {$rok='2015';};
if ($rok=='16') {$rok='2016';};
if ($rok=='17') {$rok='2017';};
if ($rok=='18') {$rok='2018';};
if ($_GET["mesic"]=='') {$mesic=Date("m");};
if ($_GET["rok"]=='') {$rok='20'.Date("y");}; 
if ($_GET["den"]=='') {$den=Date("d");}; 
$db = mysql_connect($hostname_test, $username_test, $password_test);
mysql_select_db($database_test,$db);
$vybranyzarizeni=  $_GET["zkratka"];/// and DAY(datum) = '$den'
$nastaveni='0';
$result = mysql_query("SELECT id FROM 136223_pilat.data WHERE id in ((SELECT id FROM <tabulka> WHERE datum BETWEEN '2016-07-01' AND '2016-07-20' ORDER BY datum DESC LIMIT 1), (SELECT id FROM 136223_pilat.data WHERE datum BETWEEN '2016-07-01' AND '2016-07-20' ORDER BY datum ASC LIMIT 1))",$db);

// Zaloha
//$result = mysql_query("SELECT * FROM d136223_pilat.data where MONTH(datum) ='$mesic' and zapinani='$nastaveni' and YEAR(datum) = '$rok' and zarizeni='$vybranyzarizeni' order by datum,cas asc",$db);
// Zaloha
$radku = mysql_num_rows($result);

printf("<table border=0 width=350px align='center'>\n<tr>\n");
printf("<td></td><td></td></tr>\n");
printf("<td bgcolor='#FF9900'><font color='black'>Datum</td><td bgcolor='#FF9900'><font color='black'>Cas</td><td bgcolor='#FF9900'><font color='black'>Teplota</td><td bgcolor='#FF9900'><font color='black'>Podtlak</td><td bgcolor='#FF9900'><font color='black'>Teplota venkovni</td></td><td bgcolor='#FF9900'><font color='black'>Spotreba</td></td><td bgcolor='#FF9900'><font color='black'>Zapinani</td></tr>\n");

for($i=0;$i<$radku;$i++)
{
if (mysql_result($result,$i,"datum")==$datum) 
{
printf("<td bgcolor='#FFEFD5'><font color='black'> %s</font></td>\n",
mysql_result($result,$i,"datum"));
printf("<td bgcolor='#FFEFD5'><font color='black'> %s</font></td>\n",
mysql_result($result,$i,"cas"));
printf("<td bgcolor='#FFDAB9'><font color='black'> %s</font></td>\n",
mysql_result($result,$i,"teplota"));
printf("<td bgcolor='#FFEFD5'><font color='black'>- %s</font></td>\n",
mysql_result($result,$i,"podtlak"));
printf("<td bgcolor='#FFDAB9'><font color='black'> %s</font></td>\n",
mysql_result($result,$i,"teplotav"));
printf("<td bgcolor='#FFEFD5'><font color='black'> %s kw</font></td>\n",
mysql_result($result,$i,"spotreba"));
printf("<td bgcolor='#FFDAB9'><font color='black'> %s</font></td></tr>\n",
mysql_result($result,$i,"zapinani"));
} 
}
mysql_close($db);
printf("<td></td><td></td></tr>\n");
?>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: