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, 11.11.2009, on-line

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

ikona 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í.
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

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

ikona Jakub Vrána:

Zadání je myšleno tak, že chceme zobrazovat jedny i druhé.
28.12.2009 12:22:46

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