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).

Jakub Vrána, Řešení problému, 11.11.2009, diskuse: 11 (nové: 0)

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 :)

ikona Jakub Vrána OpenID:

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?

ikona Jakub Vrána OpenID:

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

ikona Jakub Vrána OpenID:

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)";

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.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.