Toon posts:

[php & MySQL] sorteren op datum

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo

Ik ben net begonnen met m'n eigen website. Maar ik zit met een probleem: ik wil nl dat er nieuws gepost wordt op de site, maar dat dit gerangschikt wordt op datum.
Dus zoiets:
code:
1
2
3
4
5
6
7
8
9
10
-----------------------
          Datum
-----------------------
headline 1
headline 2
-----------------------
     volgende Datum
-----------------------
headline 1
headline 2

en dat hij zo verder doet, totdat hij 30 headlines heeft. Nu is het me wel al gelukt om die 30 headlines weer te geven, maar nog niet de datum(of toch niet zonder deze zelf 30x te laten herhalen :9 ). Iemand een idee?
m'n code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$selecteren="SELECT * FROM news";
    $uitvoeren=mysql_query ("$selecteren");
    $total= mysql_num_rows($uitvoeren);
    if($total>="30"){
        $total2 = $total-"30";
    }else{
        $total2 = "0";
    }
    $statement="SELECT * FROM news ORDER BY id DESC LIMIT 0,30";
    $exec= mysql_query($statement);
        echo "[img]'layout/images/modding.jpg'[/img] Modding || [img]'layout/images/weaken.jpg'[/img] Tweaking || [img]'layout/images/gadgets.jpg'[/img] Gadgets || [img]'layout/images/overige.jpg'[/img] Overige || [img]'layout/images/hardware.jpg'[/img] Hardware<br><br>";
    $i="0";
    echo "<table valign=top>";
    while($i<=$total){
    $gegevens = mysql_fetch_array($exec, MYSQL_ASSOC);
    $categorie="$gegevens[cat]";
    echo "<tr><td>$categorie</td><td align=left valign=top style='border-bottom: 1px solid #7D7D7D' width='490'><a href=index.php?id=1&newsid=$gegevens[id]>$gegevens[title]</a></td></tr>";
    $i++;
    }
    echo "</table>";


EDIT: typo's

[ Voor 18% gewijzigd door Verwijderd op 05-05-2005 00:00 ]


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21-09 18:44

gorgi_19

Kruimeltjes zijn weer op :9

* gorgi_19 snapt het probleem niet? De datum opslaan in een tempvar buiten de loop. In de loop controleren of de datum van de record gelijk is aan die van de tempvar. Zo niet, dan moet je een nieuwe heading aanmaken en tempvar updaten.

Waarom sorteer je verder op ID als je op datum wilt sorteren? Deze volgorde hoeft immers niet gelijk te zijn.

[ Voor 19% gewijzigd door gorgi_19 op 05-05-2005 00:04 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
omdat het laatst ingevoegde id ook meteen de laatst ingevoegde datum meekrijgt. m'n datum wordt opgeslagen onder de vorm van donderdag 5 mei 2005, dus sorteren is hier niet zo handig lijkt me?
moet ik dat dan met zo'n return(); functie doen ofzo? en hoe dan? ( sorry voor het n00b-zijn van me :'( )

[ Voor 50% gewijzigd door Verwijderd op 05-05-2005 00:09 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Sowieso kan je script flink geoptimaliseerd worden door $total weg te laten:
PHP:
1
2
3
4
5
6
7
8
9
10
11
    $statement="SELECT * FROM news ORDER BY id DESC LIMIT 0,30"; 
    $exec= mysql_query($statement); 
        echo "[img]'layout/images/modding.jpg'[/img] Modding || [img]'layout/images/weaken.jpg'[/img] Tweaking || [img]'layout/images/gadgets.jpg'[/img] Gadgets || [img]'layout/images/overige.jpg'[/img] Overige || [img]'layout/images/hardware.jpg'[/img] Hardware<br><br>"; 
    $i="0"; 
    echo "<table valign=top>"; 
    while($gegevens = mysql_fetch_array($exec, MYSQL_ASSOC)){ 
       $categorie="$gegevens[cat]"; 
      echo "<tr><td>$categorie</td><td align=left valign=top style='border-bottom: 1px solid #7D7D7D' width='490'><a href=index.php?id=1&newsid=$gegevens[id]>$gegevens[title]</a></td></tr>"; 
      $i++; 
    } 
    echo "</table>";


Die datum, kijk eens naar dit voorbeeld om een idee te krijgen:
PHP:
1
2
3
4
5
6
7
while($row = mysql_fetch_object($result)) {
   if($result->datum != $laatste_datum) {
      echo $row->datum."<br>";
      $laatste_datum = $result->datum;
   }
   echo $row->bericht."<br>";
}

[ Voor 59% gewijzigd door GlowMouse op 05-05-2005 00:13 . Reden: kleine optimalisatie ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarom zet je in godsnaam quotes om integers en variabelenamen neer? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • HyperioN
  • Registratie: April 2003
  • Laatst online: 24-05 15:42
Verwijderd schreef op donderdag 05 mei 2005 @ 00:06:
omdat het laatst ingevoegde id ook meteen de laatst ingevoegde datum meekrijgt. m'n datum wordt opgeslagen onder de vorm van donderdag 5 mei 2005, dus sorteren is hier niet zo handig lijkt me?
moet ik dat dan met zo'n return(); functie doen ofzo? en hoe dan? ( sorry voor het n00b-zijn van me :'( )
Waarom sla je dat dan niet op als timestamps?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
HyperioN. schreef op donderdag 05 mei 2005 @ 00:11:
[...]

Waarom sla je dat dan niet op als timestamps?
Omdat ik heir in het verleden al verscheidene problemen mee gehad heb... ( het kwam er niet uit zoals het zou moeten zijn :p )

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op donderdag 05 mei 2005 @ 00:22:
Omdat ik heir in het verleden al verscheidene problemen mee gehad heb... ( het kwam er niet uit zoals het zou moeten zijn :p )
En nu heb je op dit moment problemen mee omdat je het niet gedaan hebt. Gebruik in je database het type DATETIME of je kan die sortering wel vergeten. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Peter
  • Registratie: Januari 2005
  • Laatst online: 13-09 17:10
HyperioN. schreef op donderdag 05 mei 2005 @ 00:11:
[...]

Waarom sla je dat dan niet op als timestamps?
Omdat MySQL daar de datum functies voor heeft, veel handiger ;)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

.Peter schreef op donderdag 05 mei 2005 @ 00:27:
Omdat MySQL daar de datum functies voor heeft, veel handiger ;)
Euh...leg dat eens uit? :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Timestamps zijn zo makkelijk te gebruiken.

Gewoon zoiets als dit gebruiken om het juiste formaat te krijgen:
PHP:
1
2
3
4
5
6
<?php
$query = "SELECT *, UNIX_TIMESTAMP(date) AS datum from TABLE";
................
$datum = date("d-m-Y", $object->datum); 
echo $datum; 
?>

Acties:
  • 0 Henk 'm!

  • Peter
  • Registratie: Januari 2005
  • Laatst online: 13-09 17:10
-NMe- schreef op donderdag 05 mei 2005 @ 00:35:
[...]

Euh...leg dat eens uit? :P
ADDDATE, DATE_FORMAT, etc, staat allemaal in de MySQL manual. Ook functies al BETWEEN kan je makkelijk gebruiken om bijv. alle entry's van een maand op te halen =)
Noork schreef op donderdag 05 mei 2005 @ 00:54:
Timestamps zijn zo makkelijk te gebruiken.

Gewoon zoiets als dit gebruiken om het juiste formaat te krijgen:
PHP:
1
2
3
4
5
6
<?php
$query = "SELECT *, UNIX_TIMESTAMP(date) AS datum from TABLE";
................
$datum = date("d-m-Y", $object->datum); 
echo $datum; 
?>
Dat is dus juist niet handig, iets als:

PHP:
1
2
3
4
5
<php
$query = "SELECT *, DATE_FORMAT( date, '%d-%m-%Y' ) AS datum FROM tabel";
$data  = mysql_fetch_assoc( $query );
echo $data['datum'];
?>


is dan toch veel handiger, en het is nog veel sneller ook. Daar zijn die MySQL datum functies dus voor uitgevonden :)

Linkje naar de MySQL site: http://dev.mysql.com/doc/...e-and-time-functions.html

[ Voor 5% gewijzigd door Peter op 05-05-2005 00:59 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
GlowMouse schreef op donderdag 05 mei 2005 @ 00:09:
[...]
Die datum, kijk eens naar dit voorbeeld om een idee te krijgen:
PHP:
1
2
3
4
5
6
7
while($row = mysql_fetch_object($result)) {
   if($result->datum != $laatste_datum) {
      echo $row->datum."<br>";
      $laatste_datum = $result->datum;
   }
   echo $row->bericht."<br>";
}
Ja, die methode lukt wel al een beetje, enkel nog ervoor zorgen dat hij zichzelf herhaalt ( was dus ook mijn probleem :) ), zodat de andere dagen ook verschijnen 8)7 . Nogmaals: moet dit met return(); ofzo?

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
.Peter schreef op donderdag 05 mei 2005 @ 00:59:
Dat is dus juist niet handig, iets als:
.......................
is dan toch veel handiger, en het is nog veel sneller ook. Daar zijn die MySQL datum functies dus voor uitgevonden :)
Nou ja, misschien is het handiger. Het ging een beetje om 't principe van TIMESTAMP. Je moet gewoon even leren er mee uit de voeten te kunnen.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

.Peter schreef op donderdag 05 mei 2005 @ 00:59:
ADDDATE, DATE_FORMAT, etc, staat allemaal in de MySQL manual. Ook functies al BETWEEN kan je makkelijk gebruiken om bijv. alle entry's van een maand op te halen =)
Dat gaat dus mooi niet, omdat topicstarter al zijn datums als string in de database heeft staan, en niet als DATETIME / TIMESTAMP. Daarom vroeg ik dan ook om uitleg. ;)
Verwijderd schreef op donderdag 05 mei 2005 @ 01:01:
Ja, die methode lukt wel al een beetje, enkel nog ervoor zorgen dat hij zichzelf herhaalt ( was dus ook mijn probleem :) ), zodat de andere dagen ook verschijnen 8)7 . Nogmaals: moet dit met return(); ofzo?
Sorry? Je wil dingen herhalen met een return statement? Ga eerst maar eens lezen in de documentatie wat return doet, en vervolgens welke commando's herhalingen mogelijk maken. Lees dat eerst maar eens door. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Peter
  • Registratie: Januari 2005
  • Laatst online: 13-09 17:10
-NMe- schreef op donderdag 05 mei 2005 @ 01:08:
[...]

Dat gaat dus mooi niet, omdat topicstarter al zijn datums als string in de database heeft staan, en niet als DATETIME / TIMESTAMP. Daarom vroeg ik dan ook om uitleg. ;)
Ah, op die manier. Is het dan niet handiger om het tabel-type te converten?

Acties:
  • 0 Henk 'm!

  • Nick The Heazk
  • Registratie: Maart 2004
  • Laatst online: 07-09-2024

Nick The Heazk

Zie jij er wat in?

Omdat ik heir in het verleden al verscheidene problemen mee gehad heb... ( het kwam er niet uit zoals het zou moeten zijn :p )
Je kan ook steeds een extra kolom aanmaken met daarin de datum als integer opgeslagen.(bv 20050505). Je sorteerd ze vervolgens aflopend per datum. Je maakt een check of de datum uit de db de huidige is.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// DB connect en query opvraging
$prevdate = date("Ymd");
while($headlines == mysql_fetch_row($result))
   {
   if($headlines[1] != $prevdate) //headlines[1] is de datum in integervorm
      {
      $prevdate = $headlines[1]; 
      $i=0;
      }
   if($headlines[1] == $prevdate && $i == 0)
      // print de datum titel en verhoogt $i met 1. Hier staat dus geen headline maar datum info. Deze had je toch al opgeslagen in een andere kolom en kan je dus makkelijjk opvragen
   elseif($headlines[1] == $prevdate && $i != 0)
      // print de headlines van 1 bepaalde datum
    }


Zo print je voor elke nieuwe datum een kop met eronder de headlines. Normaal gesproken, als ik geen fouten heb gemaakt, slaag je op deze manier geen datums over.

Edit: Het is natuurlijk ook mogelijk om met je bestaande datums te werken en aflopend te sorteren op ID. hierbij moet je wel opletten dat je datumformatting steeds dezelfde is (bv 12 Februari 2005, 23 November 2004 etc. niet 12/05/06 en 4 Juli 2005 mixen enzo.)

[ Voor 14% gewijzigd door Nick The Heazk op 05-05-2005 01:18 ]

Performance is a residue of good design.


Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
Een timestamp lijkt me eigenlijk nog het handigste? Kun je zonder lastige ( :x ) mysql functies toch gewoon de datum vinden? Immers is de timestamp gewoon een getal, dus kun je aangeven dat tussen X en X alles moet worden weergegeven, de timestamps kun je met PHP zo maken :)

Van die lange while functies is niet handig, omdat je dan dus _alles_ uit je database moet ophalen. En als die groot wordt, gaat het script erg lang duren :)

Acties:
  • 0 Henk 'm!

  • Nick The Heazk
  • Registratie: Maart 2004
  • Laatst online: 07-09-2024

Nick The Heazk

Zie jij er wat in?

Net niet, hij wil enkel de eerste 30 headlines, dus zijn SQL-query zal er als volgt uitzien:
$result = mysql_query("SELECT * FROM news ORDER BY id DESC LIMIT 0,30");
Zo zal je steeds de laatste 30 headlines selecteren. Normalerwijze ga je niet nieuws van morgen of van gisteren posten, want dan is het natuurlijk niet nieuw meer.

Toegegeven dat een timestamp sneller zal gaan dan het vergelijken van strings (indien hij met zijn huidige kolom met datums werkt). Deze oplossing is er een waarbij er niets veranderd moet worden aan de huidige tabelstructuur. Of het de meest aangeraden is laten we best in het midden ;)

[ Voor 3% gewijzigd door Nick The Heazk op 05-05-2005 13:48 ]

Performance is a residue of good design.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Nick The Heazk schreef op donderdag 05 mei 2005 @ 01:12:
Je kan ook steeds een extra kolom aanmaken met daarin de datum als integer opgeslagen.(bv 20050505). Je sorteerd ze vervolgens aflopend per datum. Je maakt een check of de datum uit de db de huidige is.
Waarom zou je dat als integer willen opslaan, als MySQL hele mooie datum-datatypes heeft? Dat klinkt een beetje als een vierkant blokje door een rond gat duwen. ;)
Edit: Het is natuurlijk ook mogelijk om met je bestaande datums te werken en aflopend te sorteren op ID. hierbij moet je wel opletten dat je datumformatting steeds dezelfde is (bv 12 Februari 2005, 23 November 2004 etc. niet 12/05/06 en 4 Juli 2005 mixen enzo.)
Mogelijk? Zeker. Efficiënt? Neuh. Good practice? Ammenooitniet. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok ik heb het opgelost zonder timestamp door de methode van
PHP:
1
2
3
4
5
6
7
while($row = mysql_fetch_object($result)) {
   if($result->datum != $laatste_datum) {
      echo $row->datum."<br>";
      $laatste_datum = $result->datum;
   }
   echo $row->bericht."<br>";
}

glowmouse te gebruiken. maar een beetje aangepast en wat rondgespeelt met m'n query en die werkt nu :). bedankt allemaal ! ik moet beter leren debuggen :p .

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waar sorteer je nou dan op? Niet op datum lijkt me, want dan krijg je dit soort sorteringen:
• 1 februari
• 1 januari
• 10 januari
• 11 februari
• 12 maart
• 2 december
• 3 april
enz.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 23:02

pietje63

RTFM

Zoekt hij niet gewoon group?

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
iksorteer op id. logish, voor vandaag wordt er toch geen record ingeplaatst van gisteren :9 ? En eveneens wordt de tijd ook aflopend gesorteerd, ook altijd handig :).

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ehm, als je op id sorteert, dan kun je wel nooit dingen vooruit posten. Stel, je wil de site zo maken dat ie precies om 12 uur op een bepaalde datum een bepaald bericht publiceert. Wanneer je netjes een datumveld gebruikt, kun je dat heel makkelijk in je query regelen. In jouw situatie is het überhaupt niet mogelijk. :) Als je dat niet nodig hebt, dan kun je inderdaad dit blijven gebruiken, maar het blijft ranzig. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dat is ook niet de bedoeling hoor... 'k wil zoveel crew hebben nou als iemand verlof neemt gaat er niemand iets van merken :p
Pagina: 1