Gilbert Skrevet 7. desember 2004 Del Skrevet 7. desember 2004 Bakgrunn I tabell nyheter ligger id tittel dato, dato med unix timestamp. På side arkiv.php vil jeg vise en liste med år og måneder (som skal genereres automatisk på grunnlag av nyheter) og når man klikker på en måned så skal alle nyheter innenfor den aktuelle måneden komme opp. Problemstilling 1) Hvordan skal jeg spørre mysql slik at jeg får en liste over år/måneder? 2) Hvordan skal jeg spørre mysql etter alle nyheter innenfor aktuelle måned? Lenke til kommentar
audunr Skrevet 7. desember 2004 Del Skrevet 7. desember 2004 Dette blir ikke noe utfyllende svar, men likevel. 1. Bruk GROUP BY for å slå sammen rader basert på en felles verdi. SELECT MONTH(dato) FROM tabell GROUP BY MONTH(dato) Problemet her er at den ikke tar hensyn til at september måned (og alle andre måneder) finnes både i 2003 og 2004 og alle andre år. Du må med andre ord finne en funksjon som formatterer datoen til å inneholde både år og måned. Mulig at SELECT YEAR(dato) as year, MONTH(dato) as month FROM tabell GROUP BY YEAR(dato),MONTH(dato) fungerer som forventet. Sjekke dato og tids-dokumentasjonen til MySQL. 2. SELECT * FROM tabell WHERE YEAR(dato) = 2004 AND MONTH(dato) = 9 Ble litt på sparket det her. MVH Audun Lenke til kommentar
Gilbert Skrevet 7. desember 2004 Forfatter Del Skrevet 7. desember 2004 hmz... $query = mysql_query("SELECT YEAR(dato) as year, MONTH(dato) as month, dato FROM nyheter GROUP BY YEAR(dato),MONTH(dato)"); echo "Tilsammen:".mysql_numrows($query)."<br />"; $null = "0"; while($null < mysql_numrows($query)) { $dato = mysql_result($query,$null,"dato"); echo "<br />\n".date("Y.m",$dato); $null++; } Tilsammen:2 2003.11 1970.01 $query = mysql_query("SELECT * FROM nyheter ORDER BY dato DESC"); echo "Tilsammen:".mysql_numrows($query)."<br />"; $null = "0"; while($null < mysql_numrows($query)) { $dato = mysql_result($query,$null,"dato"); echo "<br />\n".date("Y.m",$dato); $null++; } Tilsammen:293 2004.12 2004.12 2004.11 2004.11 2004.11 2004.11 2004.11 2004.11 2004.11 2004.11 2004.11 2004.11 (osv) Noe jeg har misforstått? Lenke til kommentar
audunr Skrevet 7. desember 2004 Del Skrevet 7. desember 2004 SELECT DATE_FORMAT(dato, "%Y%m") as months FROM tabell GROUP BY DATE_FORMAT(dato, "%Y%m") Da får du år og måned i samme kolonne. Prøv denne før du legger til flere kolonner i resultatet. MVH Audun Lenke til kommentar
Gilbert Skrevet 7. desember 2004 Forfatter Del Skrevet 7. desember 2004 (endret) Det ble nesten kult, bortsett fra at jeg fikk samme svar som på spørringen ovenfor (den første jeg fikk ). Man kunne jo nesten tro at det var noe galt i databasen, men den viser nyheter fra 2002 i en helt ren spørring. Alltid gøy med ting man ikke får til, hvertfall når det endelig går ! Ble ikke så veldig mye klokere av mysql-dokumentasjonen, den forklarte meg mest hvilke muligheter som fantes, ikke hvordan man kunne bruke de. edit - Siste nytt Tenkte jeg skulle finne ut hva months egentlig inneholder: $query = mysql_query('SELECT DATE_FORMAT(dato, "%Y%m") as months,dato FROM nyheter GROUP BY DATE_FORMAT(dato, "%Y%m")'); echo "Tilsammen:".mysql_numrows($query)."<br />"; $null = "0"; while($null < mysql_numrows($query)) { $dato = mysql_result($query,$null,"dato"); $month = mysql_result($query,$null,"months"); echo "<br />\n".date("Y.m",$dato)."-".$month; $null++; } 2003.11- 1970.01-200608 Endret 7. desember 2004 av fjartan Lenke til kommentar
audunr Skrevet 7. desember 2004 Del Skrevet 7. desember 2004 (endret) Legger du til noe mer i SQL-koden enn det som står der? Hos meg gir SELECT DATE_FORMAT(dato, "%Y%m") as months FROM tabell GROUP BY DATE_FORMAT(dato, "%Y%m") meg en liste slik: 200409 200412 200501 200512 Har laget en liten tabell med flere artikler for hver måned/år. I dette tilfellet er det jo ikke datoen du vil ha ut, men den formatterte datoen der artiklene er gruppert sammen etter år og måned. EDIT: Bruk spørringen nøyaktig slik jeg skriver den (med rett tabellnavn), og print ut innholdet i months. MVH Audun Endret 7. desember 2004 av audunr Lenke til kommentar
Gilbert Skrevet 7. desember 2004 Forfatter Del Skrevet 7. desember 2004 (endret) Legger ikke til noen ting. Den lager kun 200501 osv på 1.1.1970. Kan det være feil format på kolonnen i mysql? bruker int 11 edit: innholdet i months er lik ingen ting Endret 7. desember 2004 av fjartan Lenke til kommentar
audunr Skrevet 7. desember 2004 Del Skrevet 7. desember 2004 (endret) Legger ikke til noen ting. Den lager kun 200501 osv på 1.1.1970. Kan det være feil format på kolonnen i mysql? bruker int 11 Det er nok det. Jeg har timestamp(14). Dvs. at datoene ser slik ut: 20041207142600. Altså: YYYYMMDDHHMMSS. MySQL timestamps er ikke UNIX timestamps. UNIX timestamps er tiden i sekunder siden UNIX epox (1. januar 1970), mens MySQL timestamps teller som angitt over. Regner med at du må endre datoformatet. EDIT: Ser nå at du skriver UNIX timestamp i første post. Feiltolket dette. MVH Audun Endret 7. desember 2004 av audunr Lenke til kommentar
Gilbert Skrevet 7. desember 2004 Forfatter Del Skrevet 7. desember 2004 Vil det si at jeg må endre datoformatet for å oppnå det jeg ønsker på arkiv.php? Lenke til kommentar
audunr Skrevet 7. desember 2004 Del Skrevet 7. desember 2004 Vil det si at jeg må endre datoformatet for å oppnå det jeg ønsker på arkiv.php? Dersom du vil bruke DATE_FORMAT, ja. Hvis ikke må du hente ut alle radene fra tabellen, og behandle dem i PHP for å slå sammen etter måned. Utvid dato fra int(11) til int(14). Bruk date() for å formattere en dato slik: ÅÅÅÅMMDDTTMMSS Altså år, måned, dag, time, minutt, sekund. Lagre denne tilbake i dato i tabellen. Konverter dato til datetime eller timestamp(14). MVH Audun Lenke til kommentar
Gilbert Skrevet 7. desember 2004 Forfatter Del Skrevet 7. desember 2004 ....da velger vi behandle i php-metoden men det er da merkelig at det ikke finnes en enklere måte å gjøre det på? Lenke til kommentar
audunr Skrevet 7. desember 2004 Del Skrevet 7. desember 2004 ....da velger vi behandle i php-metoden men det er da merkelig at det ikke finnes en enklere måte å gjøre det på? Jeg fant, jeg fant. SELECT DATE_FORMAT(FROM_UNIXTIME(dato), "%Y%m") as months FROM nyheter GROUP BY months Erstattet kolonnen i GROUP BY med months, like greit. MVH Audun Lenke til kommentar
Gilbert Skrevet 7. desember 2004 Forfatter Del Skrevet 7. desember 2004 et bilde sier mer enn tusen ord Lenke til kommentar
Gilbert Skrevet 7. desember 2004 Forfatter Del Skrevet 7. desember 2004 nå har jeg altså en liste med et sekssifret tall. Hvilken funksjon skal jeg bruke for å skille de 4 første fra de 2 siste? Lenke til kommentar
audunr Skrevet 7. desember 2004 Del Skrevet 7. desember 2004 nå har jeg altså en liste med et sekssifret tall. Hvilken funksjon skal jeg bruke for å skille de 4 første fra de 2 siste? Bruk "%Y %m" i stedet for "%Y%m" i spørringen. Så, i PHP: $YearMonth = explode(" ", $month); Da får du årstallet i $YearMonth[0] og måneden i $YearMonth[1]. Mange andre måter å gjøre dette på, men dette er nå en måte. MVH Audun Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå