Print

Print


If you're using PHP you could use natsort() on the result,

http://php.net/manual/en/function.natsort.php

Alternatively, you could try ordering by the length of the VARCHAR field first,

ORDER BY LENGTH(field), field 

Sent from mobile

> On Oct 25, 2017, at 2:11 PM, Jodie Gambill <[log in to unmask]> wrote:
> 
> Hi Will -
> I had a similar task a few years ago on a small project, though we only
> used the classMark and classNum (from your example) parts of the call
> number for what we needed. I implemented it as you outlined above, with two
> separate fields to enable proper sorting -- classMark as varchar and
> classNum as float. I look forward to hearing if anyone else has done it
> more efficiently!
> -Jodie
> 
>> On Wed, Oct 25, 2017 at 3:55 PM, Will Martin <[log in to unmask]> wrote:
>> 
>> We have a small web app with a MySQL backend, containing lists of books
>> that have been reported lost and tracking our efforts at locating them.
>> Access Services requested that the list of currently missing books be
>> sorted according to LC call number.  So we did, but the results are ordered
>> in that uniquely digital "1000 comes before 2" way.  For example, human
>> logic would sort these seven call numbers like so:
>> 
>>        HM132 .A343
>>        HM251 .M2 1960
>>        HM278 .S37 1990
>>        HM281 .C6713 1985
>>        HM281 .H6 1958
>>        HM1126 .F56 2011
>>        HM1261 .K64 1978
>> 
>> But MySQL sorts them like so:
>> 
>>        HM1126 .F56 2011
>>        HM1261 .K64 1978
>>        HM132 .A343
>>        HM251 .M2 1960
>>        HM278 .S37 1990
>>        HM281 .C6713 1985
>>        HM281 .H6 1958
>> 
>> Currently, these are stored in a VARCHAR column in the MySQL table.  The
>> research that I've done suggests that there is no way just sort that column
>> using ORDER BY, and that we'll have to split out the call number into
>> separate columns for its component parts:
>> 
>>        HM = classMark
>>        251 = classNum
>>        .M2 = cutter
>>        1960 = pubYear
>> 
>> ... and then do something like "ORDER BY classMark, classNum, cutter,
>> pubYear".
>> 
>> This database is unlikely to grow beyond a few hundred active records at
>> most, so I'm not too concerned about the computational overhead of doing
>> all that sorting.  But it's going to be a fair bit of work to modify the
>> table definition and then rejigger all the associated SQL queries in the
>> app.
>> 
>> Does anyone have a better solution for sorting LC call numbers in MySQL
>> results?
>> 
>> Thanks.
>> 
>> Will Martin
>> 
>> Head of Digital Initiatives, Systems & Services
>> Chester Fritz Library
>> University of North Dakota
>>