Výpis aktuálních novinek
Na titulní stránce webu můžeme chtít zobrazovat novinky z posledního měsíce. To se dá v MySQL snadno zařídit podmínkou vytvoreno > NOW() - INTERVAL 1 MONTH. Po prvnotním nadšení ale aktivita často opadne, takže můžeme chtít zobrazovat vždy alespoň tři poslední novinky nehledě na čase. To se dá zajistit klauzulí LIMIT 3.
Když chceme zobrazovat vždy poslední tři novinky, ale zároveň všechny z posledního měsíce, můžeme použít příkaz UNION:
(SELECT * FROM novinky ORDER BY vytvoreno DESC LIMIT 3) UNION (SELECT * FROM novinky WHERE vytvoreno > NOW() - INTERVAL 1 MONTH ORDER BY vytvoreno DESC)
Využívá se toho, že příkaz UNION odstraňuje duplicity (pokud nepoužijeme modifikátor ALL).
Jakub Vrána, Řešení problému
Diskuse
visitor:
Maličkost s velkým informačním nábojem...jakube jak vás napadne napsat takový "článek"? Je to tím, že jste to zrovna někde použil, nebo vás prostě osvítila múza :)
Jakub Vrána
:
Většinou píšu o tom, co zrovna řeším, ale v tomto případě mě téma článku napadlo po probuzení.
Andrew:
Neměl bys programovat před spaním. Pak se ti o PHP i zdá a jsou z toho takovéto články (i když pro nás je to vlastně pozitivní).n:
Chybí mi zde tlačítko "líbí se mi". Takovéto články jsou nelepší. Děkuju :)bublifuk:
Neni v tomto pripade lepsi "now()" nahradit stringem 2009-11-11, tak aby se pouzila query cache?
Jakub Vrána
:
Ano, bylo by to lepší. Časové funkce na straně MySQL mám ve zvyku používat kvůli nezávislému nastavení časových pásem v MySQL.
petrr:
to si delas srandu! vcera jsem to iste resil a ty to napises az ted! (mysleno v dobrem) :)Tomáš Neděla:
No, pokud bych bral v potaz přímo zadání:Když chceme zobrazovat vždy poslední tři novinky, ale zároveň všechny z posledního měsíce.
Není přímo lepší použít toto?:
select * from novinky where month(vytvoreno)=month(now()) order by vytvoreno DESC limit 3
Jakub Vrána
:
Zadání je myšleno tak, že chceme zobrazovat jedny i druhé.
simonik:
Já jsem to použil, ale řazení není po sobě.
Datumy jdou takhle :28.11,22.11,3.11,3.11,11.11
$a="(SELECT id,DATE_FORMAT(datum,'%d.%m.%Y ') AS datum2,misto_akce,druh_akce,radku,autor,nadpis,obsah,zobrazeno FROM prispevky WHERE druh_akce IN $vyber ORDER BY datum DESC LIMIT 2) UNION (SELECT id,DATE_FORMAT(datum,'%d.%m.%Y ') AS datum2,misto_akce,druh_akce,radku,autor,nadpis,obsah,zobrazeno FROM prispevky WHERE datum > NOW() - INTERVAL 1 MONTH AND druh_akce IN $vyber ORDER BY datum DESC)";
Diskuse je zrušena z důvodu spamu.

