Voor de website van een plaatselijke dartvereniging heb ik een script in elkaar gezet voor een overzicht van de ranking. Echter spuugt php het niet helemaal uit zoals ik wil.
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?
<?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());
?>
Het lijkt op een probleem met de verschillende datatypes, althans, dit wil nog wel eens dit soort problemen opleveren.
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é ...
Jouw probleem wordt veroorzaakt door het gebruik van het verkeerde datatype. De waarde 100 komt bijvoorbeeld voor de waarde 2. Dit omdat je eerst 1 krijgt en dan pas 2... Er wordt alphabetisch gesorteerd en niet nummeriek.
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:
SELECT 1 + 2 AS totaal
Resultaat:
3
De database kan beter rekenen dan dat jij dat kunt... ;)
Bovenstaand was me reeds bekend, echter was dit (op dit moment) nog niet het probleem. Zoals je in de tabel kon zien heb ik de kolom "naam" het type varchar meegegeven. In de query heb ik aangegeven dat dit alfabetisch georderd dient te worden (ASC), echter dit doet hij maar gedeeltelijk, dus tot en met persoon nr 27 en in mijn ogen staan de punten hier momenteel nog los van? Dit omdat ik in phpmyadmin de query "SELECT naam FROM ranking order by naam ASC" meegeef wat ook een negatief resultaat geeft.
Bovenstaande reactie lost dit probleem niet op, of ik zie uiteraard iets over het hoofd :S
punten => geheel getal => INTEGER, geen andere keuze mogelijk.
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.
Om te beginnen bedankt voor de snelle reacties!
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.
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.