[OPGELOST] Een simpel ORDER BY die maar niet wilt lukken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

G P

G P

27/08/2012 15:54:31
Quote Anchor link
Ik heb een tabel met daarin een VARCHAR (25)
In die VARCHAR kunnen cijfers en letters staan.
BIJVOORBEELD:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
- abc
- 123
- 12ab3c
- 123abc
- abc123
Bij het ophalen van die waarden lukt het niet om de volgorde juist te tonen.
Ik heb bijvoorbeeld volgende waarden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
woord 1
woord
woord 2
woord 10
5 woorden
4 woorden
1 woord met 1 letter
Bij een ORDER BY tabel ASC krijg ik het volgende
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
1 woord met 1 letter
4 woorden
5 woorden
woord
woord 1
woord 10
woord 2
Let 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)
PHP script in nieuw venster Selecteer het PHP script
1
$sql = "SELECT kolomnaam FROM tabel ORDER BY kolomnaam ASC, CAST(kolomnaam AS SIGNED) ASC";
Maar ook dit geeft niet de juiste resultaten.

Ik hoop dat jullie begrijpen wat ik bedoel
Gewijzigd op 27/08/2012 17:00:50 door G P
 
PHP hulp

PHP hulp

28/03/2024 14:39:39
 

27/08/2012 15:59:01
Quote Anchor link
Je sql sorteert alfanummeriek omdat je veld zo is.
Hij doet het perfect!
 
G P

G P

27/08/2012 16:08:55
Quote Anchor link
Neen, hij doet het niet perfect anders zou ik mijn vraag niet stellen.
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
 
John Berg

John Berg

27/08/2012 16:14:39
Quote Anchor link
Ik ben het met Stef eens, dat is de manier waarop alfanumerieke data gesorteerd wordt.

Als je wil bereiken dat ie 'nummers' in strings 'goed' sorteren, dan moet je 'wielen 4' vervangen door 'wielen 04' enz.
 
G P

G P

27/08/2012 16:26:37
Quote Anchor link
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.
 
Kris Peeters

Kris Peeters

27/08/2012 16:28:28
Quote Anchor link
Dit zelfde fenomeen heb je toch ook voor als je bestanden in een map sorteert per bestandsnaam.

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
 
Eddy E

Eddy E

27/08/2012 16:28:37
Quote Anchor link
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".
Gewijzigd op 27/08/2012 16:37:19 door Eddy E
 
Erwin H

Erwin H

27/08/2012 16:51:06
Quote Anchor link
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
 
G P

G P

27/08/2012 16:57:57
Quote Anchor link
Bedankt Eddy Erkelens, tenminste toch 1 iemand die mij op de goede weg kon brengen!
FAN-TAS-TISCH artikel!
 
Frank WD

Frank WD

27/08/2012 17:21:31
Quote Anchor link
Gunther,

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
 
Kris Peeters

Kris Peeters

27/08/2012 17:41:29
Quote Anchor link
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, ...
 
G P

G P

27/08/2012 17:46:38
Quote Anchor link
En wat doe ik dan met BMW? Of met 2 vrachtwagens? Of met 1 vrachtwagen en wielen 10?
Zoals ik ook weeral zei, dit zijn enkel maar voorbeelden, uiteindelijk resultaat heeft totaal niets te maken met auto's.
 
Eddy E

Eddy E

27/08/2012 18:33:17
Quote Anchor link
Om wat voor gegevens gaat het dan wel?
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)
PHP script in nieuw venster Selecteer het PHP script
1
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


Zal wel werken, maar of het echt te vertrouwen is? Wat als je wielen_10 doet? Dan werkt het gelijk niet meer.
 
G P

G P

27/08/2012 19:03:01
Quote Anchor link
wielen_10 kan nooit want alleen a-zA-Z0-9 en spatie zijn toegestaan :)

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
 

27/08/2012 19:09:44
Quote Anchor link
Ik noem het varen op een lekke boot
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.