Výpis aktuálních novinek
Školení, která pořádám
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).
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 :)
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?
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
Zadání je myšleno tak, že chceme zobrazovat jedny i druhé.
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)";
Pavel:
Vždycky když googlím nějaké řešení v php tak skončím tady :D
Diskuse je zrušena z důvodu spamu.