Gå til innhold

Generere oversikt over artikler etter måned/år


Anbefalte innlegg

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
Videoannonse
Annonse

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

hmz... :ermm:

 

$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

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 av fjartan
Lenke til kommentar

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 av audunr
Lenke til kommentar
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

 

:dontgetit:

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 av audunr
Lenke til kommentar
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
....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
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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...