Autor Zpráva
lukame
Profil *
Zdravíčko,
prosím, jak se dá přepsat podmínka z klasického selectu:
 $celkem=mysql_query(" SELECT SUM(celkem) AS soucet FROM tabulka WHERE YEAR(datum) = '2015' and MONTH(datum) = '08' and DAY(datum)='01'  "); 

v DIBI? Resp.: přepsat tento dotaz?
A pokud mám v databázi datum klasicky DATE, odpovídá tomu modifikátor dibi %d ? Díky
Alphard
Profil
Bez ohledu na dibi není optimální volat na sloupec funkci, znemožňujete to používání indexů a celkově je to drahá operace.
Pokud je sloupec datum typu date, je lepší použít jednoduché datum = '2015-08-01'. Pokud by byl typu datetime, tak datum between '2015-08-01 00:00:00' and '2015-08-01 23:59:59'.

V dibi potom jednoduše např.
$select->where('datum = %d', $datum);
lukame
Profil *
Díky. Drahá operace se rozumí na čas? Já měl za to, že nemá na čas dotazu vůbec vliv?
nightfish
Profil
lukame:
Drahá operace se rozumí na čas? Já měl za to, že nemá na čas dotazu vůbec vliv?
Zásadní vliv to má v případě, kdy je nad sloupcem datum vytvořen index - v případě použití funkcí se index nepoužije a zpracování dotazu může trvat řádově déle, protože se pro porovnání musí projít všechny řádky tabulky, vypočítat hodnoty funkcí YEAR, MONTH a DAY a ty teprve porovnat.

Mimochodem některé databáze (např. PostgreSQL) umí vytvořit index nejenom nad samotným sloupcem, ale i nad výsledkem funkce nad sloupcem zavolané.
lukame
Profil *
Ještě bych chtěl navázat.... jak to udělat v dibi, pokud chci řekněme sumu v jednom měsíci? Nelze tedy zadat datum ve výše uvedené formě. Prostě sečíst sumu v měsíci. V klasickém zápisu to bylo:
 $celkem=mysql_query(" SELECT SUM(celkem) AS soucet FROM tabulka WHERE YEAR(datum) = '2015' and MONTH(datum) = '08'   "); 
juriad
Profil
lukame:
Jaktože nelze?
SELECT SUM(celkem) AS soucet FROM tabulka
WHERE datum >= '2015-08-01' AND datum < '2015-09-01' # případně: <= '2015-08-31 23:59:59'
lukame
Profil *
OK, myslel jsem, jestli by to opravdu nešlo zapsat "podle mě" lépe přímo do sql dotazu v DIBI bez dalších proměnných navíc.
juriad
Profil
Chceš od dibi něco, co neumí ani nechce umět. dibi byla, je a bude jednoduchá vrstva, která se nestará o logiku, stará se jen o to, že dotaz, který napíšeš se neporouchá doplněním hodnot a mimo to se umí chytře chovat k polím hodnot.

Pokud by měla umět sestavovat dotazy na jednotlivé měsíce, měla by umět sestavovat dotazy i pro sudé měsíce? Pro pátky 13.? Pro dny, kdy je měsíc v úplňku? Chvíle zatmění slunce?
lukame
Profil *
OK, díky. Stačilo říct, že to neumí...:-) Používám ji chvíli, jsem max spokojenej a zjišťuji možnsti. Díky
Alphard
Profil
lukame, juriad:
Nevím, jestli si rozumíte. Pokud lukame chce pomocí dibi volat dotaz [#5] (tj. s funkcemi year a month), tak samozřejmě může. Pomocí dibi lze volat libovolný SQL dotaz. Převod na [#6] je jen otázkou optimalizace.

lukame:
dibi je databázová vrstva, má být používána v rámci uživatelského modelu (to už psal [#8] juriad), takže stačí přidat metodu, kterou si budete parametrizovat.
public function getSumInMonth($year, $month) {
  return // tady bude váš dotaz, ať už kterákoliv verze
}

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: