Autor Zpráva
leonek
Profil
Dobrý den

Potřebuji aby mi následující dotaz vrátil ve sloupci "do" buď skutečnou hodnotu, nebo v případě že je NULL tak hodnotu NOW() + INTERVAL 1 YEAR. Prostě se mi nedaří zprovoznit ve SQL dotazu pomídnku IF.

SELECT *, IFNULL(do, NOW() + INTERVAL 1 YEAR) as do FROM `db`.`tabulka` WHERE od < NOW() < do  ORDER BY ...

Předem děkuji za případnou pomoc... :-)
juriad
Profil
A co to píše za chybu?
Možná může být problém v tom, že ti existují dva sloupec do: první je původní, druhý je pojmenovaný výstup toho IFNULL.

V dotazu máš ještě dvě další chyby:
1) od < NOW() < do nelze takto zapsat; správně je buď: od < NOW() AND do > NOW(), nebo NOW() BETWEEN od AND do
2) v části WHERE se nemůžeš odkazovat na aliasy vytvořené v části SELECT (sloupec do bude vždy ten originální); WHERE se ve skutečnosti vykonává dříve; můžeš ale do obou částí napsat ten samý výraz a databáze to zoptimalizuje a vykoná ho jen jednou.

Pokud chceš definovat do jen kvůli porovnávání ve WHERE, tak to udělej jinak:

SELECT * FROM tabulka WHERE od < NOW() AND (do IS NULL OR do > NOW())
abc
Profil
2) v části WHERE se nemůžeš odkazovat na aliasy vytvořené v části SELECT (sloupec do bude vždy ten originální); WHERE se ve skutečnosti vykonává dříve; můžeš ale do obou částí napsat ten samý výraz a databáze to zoptimalizuje a vykoná ho jen jednou.

v MySQL mi docela normálně funguje toto:
SELECT COUNT(*) AS pocet FROM table GROUP BY nazev ORDER BY pocet DESC
Nerýpu, jen by mě zajímalo, jak to doopravdy je
juriad
Profil
abc:
Napřed se vykoná část FROM a WHERE (tedy joiny a podmínky), následně se vyhodnotí část GROUP BY (sloučení řádků do množin), pak část SELECT (tam si můžeš pojmenovat výrazy a používat agregační funkce na množinách), pak HAVING (filtrování těsně před výsledkem), pak ORDER BY (seřazení výsleků) a na závěr LIMIT (omezení výsleků).
leonek
Profil
juriad:
Děkuji za pomoc.
Použil jsem váš příklad, ale zjistil jsem že ačkoliv je ve sloupci typu DATETIME nastavena výchozí hodnota NULL, při ukládání se vloží 0000-00-00 00:00:00. Tak jsem upravil dotaz a funguje:

WHERE od < NOW() AND (do='0000-00-00 00:00:00' OR do > NOW())
leonek
Profil
S tim dotazem mám pořád problémy.

Potřeboval bych následující podmínku v předchozím MySQL dotazu:
Když ID=cislo a SERIE!=cislo2 tak přidej podmínku, že se id=cislo.

Napsal jsem takovýto paskvil:
SELECT * FROM `DB`.`tabulka` WHERE if((SELECT id, serie FROM `DB`.`tabulka` WHERE id=".$cislo." AND serie!=".$cislo2."), id=".$cislo.", '') AND ... ORDER BY ...
juriad
Profil
leonek:
A kryptičtěji to napsat nešlo? Absolutně nechápu čeho se snažíš dosáhnout.
Zkus to více popsat, jinými pojmy než tabulka, číslo a číslo2. Klidně uveď příklad vstupu a očekávaného výstupu.

Snažíš se na základě existence nějakého záznamu primárně hledat jemu podobné, a pokud neexistuje, vystačíš si s jakýmikoli?
leonek
Profil
juriad:
Snažíš se na základě existence nějakého záznamu primárně hledat jemu podobné, a pokud neexistuje, vystačíš si s jakýmikoli?

V podstatě ano...

Mám id naposledy použitého záznamu - $cislo
Mám maximální počet sérií - $cislo2

Pokud existuje záznam, který odpovídá těmto kritériím, vyber ho. Pokud neexistuje vyber jiný, podle následujících kritérií... atd
juriad
Profil
leonek:
Hele, to opravdu nevím. Možná ti nezbyde nic jiného než položit víc dotazů.
Pokud bys napsal všechna možná kritéria a strukturu dat, snad by šlo něco vymyslet.

Pokud chceš vždy jediný záznam, možná by šlo použít:
SELECT * FROM
(
    SELECT 1 as poradi, * FROM tabulka WHERE kriterium1
  UNION
    SELECT 2 as poradi, * FROM tabulka WHERE kriterium2
  UNION
    SELECT 3 as poradi, * FROM tabulka WHERE kriterium3
) x
ORDER BY poradi ASC LIMIT 1
leonek
Profil
Děkuji z snahu, budu to muset vyřešit kombinací úrovně PHP a MySQL s pomocí více dotazů.

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:

0