Autor | Zpráva | ||
---|---|---|---|
leonek Profil |
#1 · Zasláno: 20. 1. 2014, 16:00:49
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 |
#3 · Zasláno: 20. 1. 2014, 20:35:09
„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 |
||
juriad Profil |
#4 · Zasláno: 20. 1. 2014, 20:47:27
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 |
#5 · Zasláno: 21. 1. 2014, 09:26:28
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 |
#6 · Zasláno: 21. 1. 2014, 14:12:40
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 |
#7 · Zasláno: 21. 1. 2014, 17:50:10
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 |
#8 · Zasláno: 22. 1. 2014, 09:19:17
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 |
#9 · Zasláno: 22. 1. 2014, 10:29:28
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 |
#10 · Zasláno: 24. 1. 2014, 10:19:41
Děkuji z snahu, budu to muset vyřešit kombinací úrovně PHP a MySQL s pomocí více dotazů.
|
||
Časová prodleva: 11 let
|
0