Re: Sorting MySQL queries

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 06/11/06, Richard Lynch <ceo@xxxxxxxxx> wrote:
On Sun, November 5, 2006 7:13 am, Dotan Cohen wrote:
> I have a list of subjects, such as "Linux", "Open Source", and "the
> World Wide Web". The subjects are stored in a database and being
> retrieved via php. I currently organize them alphabetically with SQL's
> ORDER BY ASC argument, however, if there is a preceding "the " or "a "
> then that is considered as part of the alphabetical order. Thus, all
> the subjects starting with "the " are grouped together, as are the
> subjects starting with "a ". How can I order by ascending, without
> taking the preceding "the " or "a " into account?
>
> ** Example:
> Now, the list is ordeded like this:
> a Distribution
> a Text Editor
> a Virus
> Bluetooth
> Copyleft
> DRM
> Fedora
> Firefox
>
> However, I'd like it to be ordered like this:
> Bluetooth
> Copyleft
> a Distribution
> DRM
> Fedora
> Firefox
> a Text Editor
> a Virus
>
> Current code:
> $query  = "SELECT subject FROM table ORDER BY subject asc";
> $result = mysql_query($query);

I forget the SQL 'CASE' syntax, but it goes something like this:
$query = "SELECT subject, case when substring(lower(subject, 0, 4) =
'the ') then substring(subject, 4)  when substring(lower(subject, 0,
3) = 'an ' then substring(subject, 3) when substring(lower(subject, 0,
2) = 'a ') then substring(subject, 2) else subject) as subject_alpha
FROM table ORDER BY subject_alpha";

'Course, that renders ineffective any index you got on 'subject',
almost for sure.

If the table is HUGE and/or performance is an issue, you could set up
a second field called subject_alpha which holds the alphabetized
version.

Then you need to be sure it's always kept in sync by your application.

Or triggers and all that in later MySQL.

Actually, super-recent MySQL has user-defined functions, I think, so
the previous solution by another post may be better in that case.

I do not think there is a magic built-in easy MySQL function for this,
though you never know unless you read MySQL docs and ask on the MySQL
mailing list.  (Hint, hint.)


I just subscribed back to the MySQL list (unsubscribed a few months
ago) to ask the question. If there's no super-smart way to do it, then
I'll use the pseudo-subject field and sort on it. Performance-wise, I
agree that it can't be beat.

Thanks.

Dotan Cohen

http://lyricslist.com/
http://what-is-what.com/what_is/xml.html

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux