Miten mahtaisi olla järkevintä toteuttaa blog/uutis-systeemiin arkistointi. Haluaisin kuukausittain viestit eri sivuille, eli pitäisi saada eri vuosien eri kuukaudet selville tietokannasta.
Uutiset ovat mySQL:ssä, taulun rakenteena
id|otsikko|viesti|kirjoittaja|aika(unix timestamp)|
Tuosta pitäisi saada lopputulokseksi jotain tyyliin:
2006 Tammikuu
2006 Helmikuu
2006 Maaliskuu
jne.
Laske jokaista kuukautta kohden kaksi arvoa: aika aivan kuukauden alussa ja kuukauden lopussa.
Siis esim. tämän vuoden tammikuusta:
alku = 1.1.2006 kello 00:00:00
loppu = 31.1.2006 kello 23:59:59
Tähän sopii hyvin PHP:n mktime-funktio.
Nyt tietokannasta on helppo hakea viestejä tietyn kuukauden sisällä:
SELECT * FROM uutiset WHERE aika >= alku AND aika <= loppu
Laitat sivun uutiset.php, jolle voi antaa GET-muuttujana aikavälin alun ja lopun, ja käytät MySQL-kyselyssä niitä:
WHERE aika BETWEEN $_GET['alku'] AND $_GET['loppu']
Edit: vai olikos tuo vain DATE-tyypille? Siinä tapauksessa:
WHERE aika >= $_GET['alku'] AND aika <= $_GET['loppu']
Sivulla arkisto.php generoit listan, jossa on sopivat linkit jokaiselle kuukaudelle:
for ($v = $perustusvuosi; $v <= $tama_vuosi; ++$v) { for ($kk = 1; $kk <= 12; ++$kk) { # echo '<a href="uutiset.php?alku='.mktime(kuun_alku).'&loppu='.mktime(kuun_loppu).'">'; } }
Kas, olinpa hidas.
Itselläni tuli mieleen lisätä tauluun uusi kenttä "arkisto", johon tallennettaisiin haluttu vuosi-kk -yhdistelmä.
arkisto
200601
200602
200603
Tämän jälkeen olisi helppo hakea arkiston tietueiden eri arvot:
SELECT DISTINCT arkisto FROM taulu
Jatkan vielä tuon mktime():n ja kuukauden alun ja lopun kanssa järkeilyä, mutta tuo vaikuttaisi toimivalta oikotieltä.
Suotta uutta kenttää moiselle värkkäät, voithan hoitaa tuon ihan aikakenttää muotoilemalla. Eli esim.
SELECT DISTINCT(DATE_FORMAT(FROM_UNIXTIME(aika), '%Y%d')) AS kk FROM taulu
Koodi vedetty hatusta, joten oletettavasti ei toimi sellaisenaan.
Kiitokset Olga. En itse tiennyt tuota DATE_FORMAT ja nyt toimii. Tuo sinun koodisi toimi muuten suoraan, mutta tuli muodossa vuosipäivä :)
SELECT DISTINCT ( DATE_FORMAT( FROM_UNIXTIME( aika ) , '%Y%m' ) ) AS kk FROM taulu
Samalla sain tehtyä sivun, joka näyttää tietyn kuukauden uutiset.
SELECT * FROM `taulu` WHERE DATE_FORMAT( FROM_UNIXTIME( aika ) , '%Y%m' ) = '200607'
Ah joo, mutta pitäähän sitä nyt ainakin yks typo eksyä joukkoon ku hatusta jottain heittää :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.