Autor Zpráva
Tomášeek
Profil
Ahoj,

mám v databázi uložené záznamy, které mají uložené datum a den konání. Všechny záznamy jsou jednodenní, ale v daný den se jich může konat více. Struktura tabulky je zjednodušeně nazev | datum | den. Den obsahuje hodnotu `0-6` (date('w')), později tento sloupec možná odebereme, nebude-li k ničemu (přijde mi rychlejší dan konání uložit, než vždy dopočítávat, pokud si chci zobrazit jen pondělní akce. Záznamů je kolem třiceti, více jich nebude.

Chci vybrat takové záznamy, které se konají od zítra dále, celkem minimálně 3 záznamy, počet zhora není omezen (dovyberou se všechny záznamy ze dne, kdy počet vybíraných překročí "3").

1. Pokud se zítra koná 1 akce a pozítří 2 akce, budou vybrány tyto 3 záznamy.
2. Pokud se zítra koná jedna akce, pozítří nic a v pátek 4 akce, vybere se 5 záznamů.

Poradíte, jak by takový dotaz vypadal? Mě zatím nenapadl, ubíral jsem se cestou vybrat vše (což při 30 záznamech je v pohodě) a pak to nějak porovnat v PHP, ale šel bych raději tou správnější cestou.

Děkuji.
Keeehi
Profil
Tomášeek:
Co když budou zítra 4 a pozítří 2? Mají se vybrat 4 nebo 6?

Jinak co se týče přímo tohoto konkrétního problému, tak vybrat všechny seřazené záznamy starší než nějaké datum a následně jich zobrazit jen pár v aplikaci nebude při třiceti záznamech žádný problém. Při větším počtu záznamů by šlo udělat to samé, jen by se to už v databázi vyfiltrovalo na záznamy z dalších třech dní, které mají nějaký záznam. A zbytek zase v aplikaci.

Pokud by se to mělo dělat nějak hezky, byly by na to potřeba nejspíše nějaké window functions.
Tomášeek
Profil
Keeehi:
Co když budou zítra 4 a pozítří 2? Mají se vybrat 4 nebo 6?
Jen 4. Vždy se zobrazují nejbližší 3 záznamy, více je jich jen v případě, že 3. záznam je ve dni, kde jsou i další (4., 5., 6.) záznamy. Nelze vložit jen část záznamů daného dne, podmínka je stylem "Pokud je méně či rovno 3 záznamů, vlož ještě další den. Pokud je méně či rovno 3 záznamů, vlož další den. Pokud...".

Jde to tedy vybrat napřímo v databázi? Pokud vyberu všechno, jak to co nejlépe vypsat v aplikaci na úrovni PHP? Už to mám, ale je to nehezké a zbytečně složité/nepřehledné.
Kajman
Profil
Stačí
(dalsi tri zaznamy)
union
(zaznamy ze dne jako limit 1 a offset 2)
Keeehi
Profil
Kajman:
Přece stačí jen tři dny. V těch musí být přece tři záznamy.
Tedy pokud jsi nemyslel tři fixní dny. Pak by to ale nefungovalo. Ten union by nevrátil vše při rozložení apříklad 1, 1, 0, 2.
Tomášeek
Profil
Keeehi, Kajman:
Tomu moc nerozumím, co tím chtěl autor říct? :-)

Jinak je pravda, že v následujících 3 dnech ty 3+ záznamy budou určitě.
Kajman
Profil
(SELECT *
 FROM   zaznamy
 WHERE  datum >= '2018-02-14'
 ORDER  BY datum
 LIMIT  3)
UNION
(SELECT z.*
 FROM   zaznamy z
        JOIN (SELECT datum
              FROM   zaznamy
              WHERE  datum >= '2018-02-14'
              ORDER  BY datum
              LIMIT  1 offset 2) hranice
          ON z.datum = hranice.datum)
ORDER  BY datum,
          nazev

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: