Toon posts:

[MySQL] Meerdere sort orders afhankelijk van content *

Pagina: 1
Acties:
  • 270 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Mensen,

Ik kom een vaag probleem tegen als ik gebruik maak van de volgende query:
PHP:
1
$SelectToestellen = mysql_query("SELECT * from toestellen WHERE tt_merk = '$merk' ORDER BY 'tt_type' ASC");


Als ik bijvoorbeeld als "tt_type" de volgende waardes wil sorteren:

ASCENDING OUTPUT:
10000
3200
8400

DESCENDING OUTPUT:

8400
3200
10000

GEWENSTE OUTPUT:
3200
8400
10000

Nou zit het probleem dus bij de waarde 10000; hij is langer als de andere waardes. Maar je zou toch zeggen dat de output van klein - groot gaat.

Weet iemand hier de oplossing voor? zit ik gewoon te kloten met mijn query ofzo.

Bvd,

  • dajappie
  • Registratie: Januari 2005
  • Laatst online: 13:26
Is het kolomtype van "tt_type" wel int?

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:59
tt_type is een alfanumeriek veld ?

https://fgheysels.github.io/


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Doe eens ORDER BY `tt_type` in plaats van ORDER BY 'tt_type'. En als het type van je veld een varchar is, maak daar dan eerst een int van. :)

[ Voor 6% gewijzigd door NMe op 22-02-2005 13:49 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Dat is verschillend per merk dus maak nu gebruik van varchar omdat je ook een typenaam: d-400 kan hebben bijv.

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 22-04 03:55

Nick_S

++?????++ Out of Cheese Error

Laat me raden, je tt_type is van type String.

String sorteren kijkt karakter voor karakter en aangezien karakter '1' een lagere waarde heeft als karakter '2' wordt deze bovenaan gesorteerd. Wil je op numerieke waardes sorteren, zul je dit veld toch echt een ander datatype moeten geven.

edit:
Spuit 11

[ Voor 9% gewijzigd door Nick_S op 22-02-2005 13:50 ]

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Verwijderd schreef op dinsdag 22 februari 2005 @ 13:49:
Dat is verschillend per merk dus maak nu gebruik van varchar omdat je ook een typenaam: d-400 kan hebben bijv.
Dan kan het gewoon niet op deze manier. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Dan zou je moet splitten in je tabel naar,

[soort] [type] en dan dus soort = Abekss en Type = 20132

Dan kan je order by type wel usen als het een int is.

Verwijderd

Topicstarter
Raar vind ik dat wel want de geselecteerde types van bijv nokia zijn allemaal INT. een ander merk bevat wel letters/cijfers

  • Boss
  • Registratie: September 1999
  • Laatst online: 09:21

Boss

+1 Overgewaardeerd

Dat is niet raar, dat is hoe het alfabet werkt. 100 komt voor 2, zoals hierboven ook al gemeld. Je zal je ontwerp moeten aanpassen of een aparte query maken die eerst alleen de getallen uit die string trekt en dan daar op sorteren.

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • dajappie
  • Registratie: Januari 2005
  • Laatst online: 13:26
Het gaat niet om of uit jouw selectie toevallig alleen data komt die INT is, maar de manier waarop je database-server het sorteren aanpakt aan de hand van jouw tabeldefinitie. Ga maar eens bedenken hoe traag het zou worden als je server eerst alle data moet analyseren om vervolgens het voor jou passende sorteeralgoritme te vinden.

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 13-01 07:19
Als je het niet erg vind dat de query niet zo snel is kun je eerst sorteren op lengte van tt_type, en dan op alfabet.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 04-05 14:55

Janoz

Moderator Devschuur®

!litemod

Eerst op lengte sorteren? Dan komt zz voor aaa. Dat lijkt me ook niet de bedoeling.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

tis niet echt hoe het moet maar volgens mij wel een oplossing (niet getest btw). zet gewoon overal een 1 achter en die haal je dan weg bij het uitlezen.

ASCENDING OUTPUT:
100001
32001
84001

end dan
$tt_type = substr($row[tt_type],0, -1); geloof ik.

[ Voor 6% gewijzigd door Verwijderd op 23-02-2005 11:13 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 04-05 14:55

Janoz

Moderator Devschuur®

!litemod

Dat lost toch helemaal niks op?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Niet zo nette oplossing, maar werkt meestal wel goed.


SELECT * from toestellen WHERE tt_merk = '$merk' ORDER BY LPAD(tt_type,10,'0') ASC

Programmer - an organism that turns coffee into software.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 04-05 14:55

Janoz

Moderator Devschuur®

!litemod

Bovenstaande oplossing werkt dan weer niet voor typenummers waarin wel letters voorkomen.
d100 komt tussen 9999 en 10000.
500a en 500 komen niet naast elkaar. 50a tot 4999 zitten er namelijk tussen.

Al met al is het een probleem dat nauwelijks een oplossing heeft. Je zou het type nummer nog kunnen opsplitsen in een nummer, een alpha prefix en een alpha postfix, maar dan kun je geen letters middenin een typeaanduiding hebben.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-05 14:03

curry684

left part of the evil twins

Verwijderd schreef op woensdag 23 februari 2005 @ 11:11:
tis niet echt hoe het moet maar volgens mij wel een oplossing (niet getest btw). zet gewoon overal een 1 achter en die haal je dan weg bij het uitlezen.

ASCENDING OUTPUT:
100001
32001
84001

end dan
$tt_type = substr($row[tt_type],0, -1); geloof ik.
Ik zou 'm toch even testen ;)

Professionele website nodig?


  • spacebugs504
  • Registratie: Februari 2004
  • Laatst online: 18-03 15:32
Databases al weer een tijdje geleden, maar als het veld een varchar is, kun je er ook een binary type van maken :

test varchar(20) binary default NULL

Misschien dat dit een oplossing is

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Sommige mensen zijn echt totaal niet creatief met SQL, er kan zoveel meer mee dan domweg wat geklooi met where-clauses en simpele functietjes.

Je kan er toch ook zelf een (semi) natural-ordering van maken?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> select * from natural_order_test order by orderfield;
+------------+
| orderfield |
+------------+
| 1          |
| 100        |
| 2          |
| a100       |
| a200       |
+------------+

mysql> select * from natural_order_test order by
  IF(orderfield REGEXP '^[0-9]+$', CAST(orderfield AS signed), 2147483648),
 orderfield;
+------------+
| orderfield |
+------------+
| 1          |
| 2          |
| 100        |
| a100       |
| a200       |
+------------+
5 rows in set (0.00 sec)

[ Voor 6% gewijzigd door ACM op 23-02-2005 12:46 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 04-05 14:55

Janoz

Moderator Devschuur®

!litemod

En a2 en a100 en 500 en 500b dan?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ach, dat hangt er vooral van af of je eigenlijk op zoek bent naar iets dat integers apart sorteert van "de rest", of dat je echt alle getallen in strings wilt proberen te vergelijken.

Waarom is a2 geen string die na a100 moet komen? Dat hangt van de dataset af, niet van domweg het feit dat ze beide een integer bevatten ;)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Die 500, 500a, 500b etc kan je trouwens oplossen door de $ uit de regexp weg te laten, dan checked ie alleen maar op "Begint met een getal" en dat wordt bij de cast van mysql allemaal afgekapt (dus 500a -> 500) waardoor dat ofwel naar wens of fout sorteert, al naar gelang je wilt :P

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 04-05 14:55

Janoz

Moderator Devschuur®

!litemod

klopt, maar volgens mij heeft de topicstarter ook helemaal nog niet duidelijk hoe hij die dan weer wil sorteren. En dat is eigenlijk de reactie die ik op wil roepen ;)

Maar om wat life voorbeelden erbij te pakken van wat (HP printer)producten:
LJ4
LJ6Lse
LJ6Lxi
LJ2550L
LJ2550Ln

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Dat kan je meestal beter in de programmeeromgeving zelf sorteren omdat je daar twee strings tegelijk krijgt om te vergelijken, ipv maar eentje, php's natsort is iig een kandidaat om het leuk gesorteerd te krijgen.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02-05 01:32
Janoz slaat de spijker op z'n kop: voor je de query kunt schrijven moet je bedenken wat je wilt dat 'ie precies doet. Je zult dus echt een duidelijke ordening moeten verzinnen die je vervolgens in SQL gaat omzetten.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-05 14:03

curry684

left part of the evil twins

Topic renamed naar iets duidelijkers :)

Professionele website nodig?


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 04-05 14:55

Janoz

Moderator Devschuur®

!litemod

Het meest belangrijke lijkt me in eerste instantie om eens te kijken op welke volgorde je bovenstaand lijstje nu eigenlijk wilt hebben.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

PHP:
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  $array[]="LJ6Lxi";
  $array[]="LJ2550L";
  $array[]="b8400";
  $array[]="b10000";
  $array[]="LJ2550Ln";
  $array[]=10000;
  $array[]=3200;
  $array[]="a3200";
  $array[]="a8400";
  $array[]=8400;
  $array[]=10000;
  $array[]="LJ4";
  $array[]="LJ6Lse";
  $array[]="a10000";
  $array[]="a10000"; 
  $array[]="b10000";
  $array[]="b3200";
  
   natsort($array);


resultaat:
PHP:
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Array
(
    [1] => 3200
    [2] => 8400
    [0] => 10000
    [3] => 10000
    [4] => LJ4
    [5] => LJ6Lse
    [6] => LJ6Lxi
    [7] => LJ2550L
    [8] => LJ2550Ln
    [10] => a3200
    [11] => a8400
    [9] => a10000
    [12] => a10000
    [14] => b3200
    [15] => b8400
    [16] => b10000
    [13] => b10000
)


edit:
Moest hem nog ff husselen


je moet dan nog wel checken of iets en getal is of niet en die zonder quotes neerzetten want anders doet i het nog niet

[ Voor 59% gewijzigd door Verwijderd op 23-02-2005 13:53 ]


Verwijderd

Breng je data eerst in de 1e normaal vorm. Loop daarna vorm 2, 3 en 4 ook nog even langs :+ .

  • reskobon
  • Registratie: November 2001
  • Laatst online: 22-04 20:26
Je kan ook net doen alsof een attribuut van het type int is. Je kan een natural order nabootsen door dit te doen:

SELECT * FROM bla ORDER BY (stringattribuut + 0);

Ik weet echter even niet wat er gebeurt als er letters in voorkomen.

Leeg


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

dan worden die 0... dat is geen natural order, nog minder dan mijn voorbeeld. Maar zolang de topicstarter niet zijn sorteringseisen verteld heeft het weinig zin verder te speculeren.
Pagina: 1