[OPGELOST] Een simpel ORDER BY die maar niet wilt lukken
In die VARCHAR kunnen cijfers en letters staan.
BIJVOORBEELD:Bij het ophalen van die waarden lukt het niet om de volgorde juist te tonen.
Ik heb bijvoorbeeld volgende waarden:Bij een ORDER BY tabel ASC krijg ik het volgendeLet op de 3 laatste resultaten, ik krijg 1 - 10 - 2 en ik wil => 1 - 2 - 10
Het volgende heb ik al geprobeert:
- ORDER BY tabel + 0 ASC => Geeft de resultaten die eindigen met een getal goed maar dan zijn de enkele woorden weer niet goed
- ORDER BY CAST(tabel AS SIGNED) ASC => zelfde resultaat als + 0 ASC
Na 2 dagen ploeteren lukt het mij nog steeds niet
Dit heb ik nu:
Code (php)
1
$sql = "SELECT kolomnaam FROM tabel ORDER BY kolomnaam ASC, CAST(kolomnaam AS SIGNED) ASC";
Ik hoop dat jullie begrijpen wat ik bedoel
Gewijzigd op 27/08/2012 17:00:50 door G P
Hij doet het perfect!
Waarden in de database:
Audi
Ford
BMW
Citroen
wielen 4
wielen 10
wielen 6
Getoonde resultaten:
Audi
BMW
Citroen
Ford
wielen 10
wielen 4
wielen 6
OF:
Audi
Ford
BMW
Citroen
wielen 4
wielen 6
wielen 10
Maar niet:
Audi
BMW
Citroen
Ford
wielen 4
wielen 6
wielen 10
Als je wil bereiken dat ie 'nummers' in strings 'goed' sorteren, dan moet je 'wielen 4' vervangen door 'wielen 04' enz.
Er moet toch een mogelijkheid bestaan om goed te sorteren zonder dat ik bij alle nummers een 0 vooraan moet plaatsen? Ik wil dus ook niet wielen 04 maar gewoon wielen 4. Trouwens, ik ben niet de persoon die de waarden invult maar het zijn meerderen personen.
als je "image1.jpg", "image2.jpg", "image10.jpg", "image11.jpg",...
Alles wordt gesorteerd, karakter per karakter, van links naar rechts.
Ik zie niet in waarom je iets anders zou verwachten.
---
Als je een oplossing wil ...
Is er de mogelijkheid dat je het type in een apart veld zet?
Gewijzigd op 27/08/2012 16:29:56 door Kris Peeters
http://forums.codewalkers.com/database-help-83/natsort-on-mysql-832007.html
PHP heeft gewoon natsort() wat precies doet wat jij wilt. Gebruik de term "nat sort" voor zoeken. Komt van "natural sorting".
PHP heeft gewoon natsort() wat precies doet wat jij wilt. Gebruik de term "nat sort" voor zoeken. Komt van "natural sorting".
Gewijzigd op 27/08/2012 16:37:19 door Eddy E
Gunther Peeters op 27/08/2012 16:08:55:
Neen, hij doet het niet perfect anders zou ik mijn vraag niet stellen.
Je database doet precies wat jij hem opdraagt. Die doet het wel, maar je opdracht is gewoon verkeerd ;-)
Anyway, dit kan je natuurlijk wel oplossen in MySQL (en bij voorkeur niet gaan lopen klooien in php als je alle data in een database hebt staan). Wat je zal moeten doen is de strings gaan ontleden en zo opbouwen dat je het kan sorteren als je wil. Dat kan je doen bij het inserten -> krijg je meer kolommen van. Of je kan het doen tijdens het sorteren zelf -> kost meer tijd. Aan jou de keuze.
Kijk naar de string functies van mysql en ga proberen om de getallen uit de string te slopen. Bijvoorbeeld met regular expressions.
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html
FAN-TAS-TISCH artikel!
Lees na jou reactie na Eddy toe, eens de reactie van Erwin. Waarom zul je iets met php oplossen als het met mysql ook kan?
Natuurlijk nu niet gelijk zeggende dat ik weet hoe je dit kunt oplossen in mysql.
Gewijzigd op 27/08/2012 17:21:58 door Frank WD
Frank WD op 27/08/2012 17:21:31:
... Natuurlijk nu niet gelijk zeggende dat ik weet hoe je dit kunt oplossen in mysql.
Dat zijn dan weer die andere reacties; die wat minder geapprecieerd worden.
Je maakt twee velden in je db.
bv. auto_merk en auto_type.
In het eerste veld zet je "Wielen", in het tweede zet je "10".
Op deze manier kan je sorteren zoals je wil; kan je groeperen, kan je statistieken berekenen (bv. tellen hoeveel BMW's er zijn, onafhankelijk van het type), ...
en dat allemaal zonder regular expressions, zonder case/then/else's in je query, ...
Zoals ik ook weeral zei, dit zijn enkel maar voorbeelden, uiteindelijk resultaat heeft totaal niets te maken met auto's.
Want iets 380 klinkt niet logisch.
Voorkeur heeft wel SQL, als mogelijk. Mocht dat niet het geval zijn, dan kan het altijd nog in PHP.
Kijk, de code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
CASE
WHEN ASCII(RIGHT(`field`, 1)) > 47 AND ASCII(RIGHT(`field`, 1)) < 58
THEN LPAD(CONCAT(`field`, '-'), 5, '0')
ELSE LPAD(`field`, 5, '0')
END
AS `order_value`
FROM
natsort
WHEN ASCII(RIGHT(`field`, 1)) > 47 AND ASCII(RIGHT(`field`, 1)) < 58
THEN LPAD(CONCAT(`field`, '-'), 5, '0')
ELSE LPAD(`field`, 5, '0')
END
AS `order_value`
FROM
natsort
Zal wel werken, maar of het echt te vertrouwen is? Wat als je wielen_10 doet? Dan werkt het gelijk niet meer.
En dan is de query nog met 2 joins ook, het wordt anders te igewikkeld
Gewijzigd op 27/08/2012 19:03:41 door G P
Ik noem het varen op een lekke boot