Hallo allemaal,

Ik wil een ORDER BY in mijn PHP PDO code plaatsen.
Maar ik lees eigenlijk her en der op internet dat dat niet zomaar kan.

Ik zou het met fetch() of fetchall() moeten doen, maar wat ik ook doe, ik hou een vreemde volgorde.
Ik wil ordenen op datum en dan op nummer.

maar binnen 1 datum zie ik het nummer aftellen van 11 naar 1 en dan van 12 optellen naar 20. Dit moet natuurlijk van 1 naar 20 of anders om zijn.
om mijn regels te tonen, heb ik de volgende code:


<?php
				$sql_journaalposten = "SELECT * FROM tabel_journaalposten WHERE journaalposten_administratie=:journaalposten_administratie AND journaalposten_datum=:journaalposten_datum1";
				$stmt_journaalposten = $dbh->prepare($sql_journaalposten);
				$stmt_journaalposten->bindParam(':journaalposten_datum1',$datum1);
				$stmt_journaalposten->bindParam(':journaalposten_administratie',$adm_id);
				$stmt_journaalposten->execute();
?>


en een stuk verder op heb ik dan in het HTML gedeelte:


								<table align="left" class="hovertabel">
									<th>datum</th>
									<th>nr.</th>
									<th>inkomsten</th><th>uitgaven</th>
									<?php 
									// de volgende regel geeft geen 1e record.
									foreach($stmt_journaalposten->fetchall(PDO::FETCH_BOTH) as $record_journaalposten){
									//$link="index.php?id=" . $record_journaalposten['journaalposten_administratie'];
										echo "<tr><td>";
										echo substr($record_journaalposten['journaalposten_datum'],8,2)."-".substr($record_journaalposten['journaalposten_datum'],5,2)."-".substr($record_journaalposten['journaalposten_datum'],0,4)."</td><td>";
										echo $record_journaalposten['journaalposten_nummer']."\n</td><td>";
										if ($record_journaalposten['journaalposten_inkomsten']) {
											$journaalpostbedrag_debet = $record_journaalposten['journaalposten_bedrag'];
											$journaalpostbedrag_credit = "";
										} else {
											$journaalpostbedrag_debet = "";
											$journaalpostbedrag_credit = $record_journaalposten['journaalposten_bedrag'];
										}
										echo $journaalpostbedrag_debet."</td><td>";
										echo $journaalpostbedrag_credit."</td><td>";
										echo "</td></tr>"; 
									}
									?>
								</table>


Ik ben benieuwd wie me hierbij kan helpen.

Alvast bedankt.
Frits van Leeuwen
Wat zijn de typen van de kolommen waarop je probeert te sorteren?
Frits van Leeuwen op 12/10/2017 00:41:23
Maar ik lees eigenlijk her en der op internet dat dat niet zomaar kan.


Er is geen enkele reden waarom dat niet zou kunnen.

Behalve als het kolomtype en/of de data daarin zich niet leent voor sortering.
Als je *datum* van het type DATETIME is moet je bij de ORDER BY date(*datum*) zetten, anders kijkt ie ook naar de tijd, en zal je sortering op "nummer" niet veel meer doen.
Als zo'n "nummer" een primaire sleutel met een AUTO_INCREMENT is, dan moet je niet sorteren op de datum en al helemaal niet met een datumfunctie, maar gewoon op de primaire sleutel zelf. ;-)
Bedankt allemaal voor de reacties.
Ik doe het nu even uit mijn hoofd omdat ik niet thuis ben. En thuis heb ik alles bij de hand.
Het type is DATE(zonder de tijd er in) en INT. Daar naast heb ik ook een id die automatisch genummerd wordt, maar daar wil ik nu niets mee doen. Dit geldt ook voor een datestamp.

Mij is het niet duidelijk wanneer een kolom wel of niet geschikt zou zijn voor sortering. Ik dacht dat ik op alle kolommen kon sorteren. Alleen of dat dan vervolgens nuttig is, dat is een ander verhaal.

Een datum sla je op in een kolom met een DATE als kolom eigenschap, niet een Integer. Anders kun je het niet gebruiken als datum het is dan immers gewoon een getal.

Maar je zou kunnen sorteren op het ID of de datum op de manier zoals je gewend bent


<?php
$sql = "SELECT field1, field2 FROM table ORDER BY field1 ASC";
?>
Dat snap ik, maar als field1 DATE is en fielfd2 INTEGER, dan zou ik toch

<?php
$sql = "SELECT field1, field2 FROM table ORDER BY field1 ASC, field2 DESC";
?> 

moeten kunnen doen?
Zeker!
Ik had het al op die manier geprobeerd, maar dat werkte niet. Ik ga het vanavond nog eens proberen.
Zonder een indicatie van de kolomtypen en een sample van data die niet goed gesorteerd zou worden wordt het lastig om de vinger op de zere plek te leggen.

Wel twee kanttekeningen:
#1
PDO zou moeite kunnen hebben met het opvragen van de grootte van de resultaatset, alsmede het "scrollen" door de records van deze resultaatset. Wat je je moet realiseren is dat PDO niet op voorhand geschikt / geconfigureerd is voor gebruik van een specifieke database. Dit doe je door het instellen van database-specifieke opties of attributen. Het is zeer aan te bevelen om zoveel mogelijk, zo niet alle, relevante opties expliciet in te stellen om op die manier wat meer zekerheid te hebben dat je database op een voorspelbare manier werkt. De leercurve van PDO zit niet zozeer in het handjevol classes dat je gebruikt, maar in de configuratie en werking van de database-specifieke drivers. Indien je enkel gebruik maakt van een MySQL-database zou ik gewoon MySQLi gebruiken omdat deze geschreven en geoptimaliseerd is voor gebruik van deze database.

#2
Beschouw de volgende getallen:
4
312
58

Sla je dit op in een numerieke kolom en sorteer je deze getallen vervolgens oplopend krijg je het volgende resultaat:
4
58
312

Echter, als je deze opslaat in een tekstuele kolom en je sorteert deze getallen vervolgens oplopend krijg je het volgende resultaat:
312
4
58

Dit komt omdat in het eerstgenoemde geval een numerieke sortering wordt gebruikt en in het tweede geval een alfabetische (of lexicografische) sortering wordt gebruikt.

Reageren