Gebruik van de functie ASC
In eerste instantie moet alles gesorteerd worden op het aantal 180-ers, dit gaat goed. Indien het aantal 180-ers evenveel is wil ik dat php kijkt naar de naam, zodat hij daar verder op kan sorteren (a-z). Hier maak ik gebruik van ASC. Nu spuugt hij het in eerst instantie goed uit, echter bijna aan het eind gaat hij na de Z weer verder met enkele namen. Wat doe ik hier verkeerd?
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$query=
"SELECT rankid, naam, puntenl, puntent, hf, h80 FROM ranking
ORDER BY hf DESC, naam ASC ";
$result = mysql_query($query) or die (mysql_error());
?>
$query=
"SELECT rankid, naam, puntenl, puntent, hf, h80 FROM ranking
ORDER BY hf DESC, naam ASC ";
$result = mysql_query($query) or die (mysql_error());
?>
Voorbeeld: http://www.schuttersdarts.net/rankingh80.php
Zoals je kunt zien gaat het tot en met 27 goed, daarna is het mis.
Iemand enig idee waar dit aan zou kunnen liggen?
Bij voorbaat dank voor je reactie :)
Dus: Kun je aangeven hoe de tabel er uit ziet en welke datatypes je hebt gebruikt?
Offtopic: 'puntenl, puntent' lijkt mij een verkeerd datamodel. Een totaal sla je namelijk niet (of vrijwel nooit) op in de database. Een totaal bereken je wanneer je deze nodig hebt. De punten die je per leg behaalt, sla je op in een aparte tabel.
CREATE TABLE `ranking` (
`rankid` int(10) NOT NULL auto_increment,
`naam` varchar(100) NOT NULL default '',
`puntenl` varchar(50) NOT NULL default '',
`puntent` varchar(50) NOT NULL default '',
`hf` varchar(50) NOT NULL default '',
`h80` varchar(50) NOT NULL default '',
PRIMARY KEY (`rankid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=39 ;
Vrijwel overal varchar, heb wel topics gezien waar gebruik gemaakt werd van INT, echter geeft dit probleem bij de kolom "naam"...
Offtopic answer:
Ikzelf ben een amateur op het gebied van php met als gevolg dat ik (helaas) niks laat uitrekenen maar zelf de behaalde punten invoer en dus voor de invoer nog optel, waarom moeilijk als het makkelijk kan hé ...
naam => tekst van variabele lengte => VARCHAR of TEXT (in dit geval een VARCHAR)
punten => geheel getal => INTEGER, geen andere keuze mogelijk.
Zie verder de handleiding voor de overige datatypes.
Offtopic: Ga je eens verdiepen in SQL:
Resultaat:
3
De database kan beter rekenen dan dat jij dat kunt... ;)
Bovenstaande reactie lost dit probleem niet op, of ik zie uiteraard iets over het hoofd :S
De kolommen waar jij punten in wegschrijft, MOETEN van het type INT zijn (of evt. een ander nummeriek type). Doe je dat niet, krijg je problemen zodra je gaat sorteren op het aantal punten. En jij gebruikt een VARCHAR, dus heb je de genoemde problemen.
Oplossing: Datatype aanpassen.
Sorteren op uitsluitend (!) de naam zal het probleem niet zijn.
Een quote van Paultjeh:
"Dit omdat ik in phpmyadmin de query "SELECT naam FROM ranking order by naam ASC" meegeef wat ook een negatief resultaat geeft."
Dus ook als die niet op aantal sorteert werkt het niet.. Er zal dus wel wat aan de hand zijn.
Toch blijft het bij mij problemen geven, ik heb nu een aparte tabel gemaakt voor in dit geval alleen de naam die ik graag in alfabetische volgorde zie.
CREATE TABLE `naam` (
`id` int(10) NOT NULL auto_increment,
`naam` varchar(100) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=39 ;
De query ziet er nu als volgt uit:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$query=
"SELECT id, naam
FROM naam
ORDER BY naam ASC ";
$result = mysql_query($query) or die (mysql_error());
?>
$query=
"SELECT id, naam
FROM naam
ORDER BY naam ASC ";
$result = mysql_query($query) or die (mysql_error());
?>
Het resultaat is http://www.schuttersdarts.net/naamtest.php
In het begin loop het netjes van a,b,c,d, enz tot en met persoon nr 27, dan gaat het nog steeds mis.
Voor zover ik nu beredeneer is de tabel in orde en zo ook de query, noch geeft dit het juist resultaat.
Gewijzigd op 01/01/1970 01:00:00 door Paultjeh
Toch zou dit wel een heel erg vreemd en uniek probleem zijn wanneer MySQL ineens niet meer in staat is om keurig te sorteren. Al dan niet ASC of DESC.
Gooi de data eens even weg (of beter de hele tabel) en maak de boel opnieuw aan. Ik krijg het idee dat er wat verrotte of ongelukkig gekozen data in de database staat. Denk bijvoorbeeld aan spaties en html-entities.
Gevolg:
Na enige filteringen functioneert alles naar wens :)
Nogmaals bedankt voor de snelle respons.
Greetz Paul
Heb je soms namen met hoofdletters en namen met kleine letters door elkaar. Een kleine letter komt namelijk na de Z.