potřebuji z tabulky vybrat záznamy tak, aby první byl nejbližší v čase před zadaným časovým úsekem a následovaly záznamy, které jsou v zadaném časovém úseku. Zatím jsem je dával do dočasné tabulky tb pomocí dvou select:
insert tb select cas, udalost, popis from leva_udalosti where udalost = 'nazev'
and cas < '2014-05-15 14:18:00' order by cas desc limit 1;
insert tb select cas, udalost, popis from leva_udalosti where udalost = 'nazev'
and cas between '2014-05-15 14:18:00' and '2014-05-19 14:30:00' order by cas;
Nedaří se mi přijít na to, jak toho dosáhnout v jednom select :(
Nevim co (ne)dokaze MySQL. Pro MS SQL by to mohlo byt takto:
SELECT cas, udalost, popis
FROM (
SELECT TOP 1 cas, udalost, popis
FROM leva_udalosti
WHERE udalost = 'nazev' AND cas < '2014-05-15 14:18:00'
ORDER BY cas DESC
) q
UNION
SELECT cas, udalost, popis
FROM leva_udalosti
WHERE udalost = 'nazev' AND cas BETWEEN '2014-05-15 14:18:00' AND '2014-05-19 14:30:00'
nebo takto:
SELECT u.cas, u.udalost, u.popis
FROM leva_udalosti u
INNER JOIN (
SELECT u.udalost, u.cas, MIN(d.cas) AS dalsi_cas
FROM leva_udalosti u
LEFT OUTER JOIN leva_udalosti d ON d.udalost = u.udalost AND d.cas > u.cas
GROUP BY u.udalost, u.cas
) d ON d.udalost = u.udalost AND d.cas = u.cas
WHERE u.udalost = 'nazev'
AND d.dalsi_cas > '2014-05-15 14:18:00'
AND u.cas <= '2014-05-19 14:30:00'
(syntaxe je pro MS SQL, pripadne si uprav pro MySQL)
Nestandartní standart SQL. TOP MySQL nezná. První řešení jsem pochopil jako union těch select, co jsem dělal:
select cas, udalost, popis from (
select cas, udalost, popis from leva_udalosti where udalost = 'nazev'
and cas < '2014-05-15 14:18:00' order by cas desc limit 1) q
union
select cas, udalost, popis from leva_udalosti where udalost = 'nazev'
and cas between '2014-05-15 14:18:00' and '2014-05-19 14:30:00' order by cas;
druhé řešení funguje bez jakékoliv úpravy. Asi použiji to první, zdá se mi srozumitelnější.
Studoval jsem http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_least kvůli řešení jiného problému a napadlo mne ještě jiné řešení zde popisovaného problému. Pro úplnost:
set @z = '2014-04-11 11:20:30';
set @k = '2014-04-11 11:23:40';
set @u = 'pozn';
set @o = 'poznamka';
select greatest(@z, zacatek) as zac, if(isnull(konec), @k, least(konec, @k)) as kon
from nazvy_a_pozn where udalost = @u and obsah = @o
and ( (zacatek < @z and ( konec > @z or konec is null ))
or zacatek between @z and @k );
Proměnné není nutné používat, ale snáze se to při "vývoji query" píše.