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).
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 :)
11.11.2009 07:20:09
Většinou píšu o tom, co zrovna řeším, ale v tomto případě mě téma článku napadlo po probuzení.
11.11.2009 09:51:33
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í).
11.11.2009 12:55:57
n:
Chybí mi zde tlačítko "líbí se mi". Takovéto články jsou nelepší. Děkuju :)
11.11.2009 15:22:29
bublifuk:
Neni v tomto pripade lepsi "now()" nahradit stringem 2009-11-11, tak aby se pouzila query cache?
11.11.2009 18:31:35
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.
11.11.2009 21:11:03
petrr:
to si delas srandu! vcera jsem to iste resil a ty to napises az ted! (mysleno v dobrem) :)
11.11.2009 19:33:35
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
25.12.2009 23:31:14
Zadání je myšleno tak, že chceme zobrazovat jedny i druhé.
28.12.2009 12:22:46
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)";
1.12.2010 22:14:12
Pavel:
Vždycky když googlím nějaké řešení v php tak skončím tady :D
25.3.2011 07:11:53