How do I get MySQL to NOT sort my resultset?

This is a discussion on How do I get MySQL to NOT sort my resultset? within the MySQL Database forums, part of the Database Forums category; Hi All The following query works, but MySQL sorts the results set: SELECT STRINGTEXT FROM WEBSTRINGS WHERE GUI=0 AND ...


Go Back   Usenet Forums > Database Forums > MySQL Database

FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 03-12-2006
Laphan
 
Posts: n/a
Default How do I get MySQL to NOT sort my resultset?

Hi All

The following query works, but MySQL sorts the results set:

SELECT STRINGTEXT FROM WEBSTRINGS WHERE GUI=0 AND LANGID='GB' AND TOKENID IN
(312,47,48,49,50,51,52,53,54,55,56,57,58,60,61,62, 63,87,88,89,90,208,210,249,309,310,311);

This means that when I grab this in my recordset the data for TOKENID 312 is
at the end rather than being the first one, eg

I expected my resultset to come back in the following order of requests:

312,47,48,49,50,51,52,53,54,55,56,57,58,60,61,62,6 3,87,88,89,90,208,210,249,309,310,311

but it comes back as:

47,48,49,50,51,52,53,54,55,56,57,58,60,61,62,63,87 ,88,89,90,208,210,249,309,310,311,312

Is there anyway to get MySQL to not do this for this query? I really need
them to come back as is.

Thanks

Laphan


Reply With Quote
  #2 (permalink)  
Old 03-12-2006
Giuseppe Maxia
 
Posts: n/a
Default Re: How do I get MySQL to NOT sort my resultset?

Laphan wrote:
> Hi All
>
> The following query works, but MySQL sorts the results set:
>
> SELECT STRINGTEXT FROM WEBSTRINGS WHERE GUI=0 AND LANGID='GB' AND TOKENID IN
> (312,47,48,49,50,51,52,53,54,55,56,57,58,60,61,62, 63,87,88,89,90,208,210,249,309,310,311);
>
> This means that when I grab this in my recordset the data for TOKENID 312 is
> at the end rather than being the first one, eg
>
> I expected my resultset to come back in the following order of requests:
>
> 312,47,48,49,50,51,52,53,54,55,56,57,58,60,61,62,6 3,87,88,89,90,208,210,249,309,310,311
>
> but it comes back as:
>
> 47,48,49,50,51,52,53,54,55,56,57,58,60,61,62,63,87 ,88,89,90,208,210,249,309,310,311,312
>
> Is there anyway to get MySQL to not do this for this query? I really need
> them to come back as is.
>
> Thanks
>
> Laphan
>
>


MySQL *DOES NOT SORT* your results unless you explicitly ask for it.
They are returned in unspecified order, which is the fastest order the DBMS
finds your rows.
What you specify in the IN (...) clause is just a list of keys to match, and has nothing
to do with sorting.

That said, if you want to sort using a specific list, you can create a support table to achieve
this result.
For example:


desc main_table;
+----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| id | int(11) | NO | PRI | | |
| contents | char(10) | YES | | | |
+----------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)

select * from main_table;
+-----+----------+
| id | contents |
+-----+----------+
| 1 | a |
| 2 | b |
| 3 | c |
| 100 | aa |
| 200 | bb |
| 300 | cc |
+-----+----------+
6 rows in set (0.00 sec)

select * from main_table where id in (200,2,100);
+-----+----------+
| id | contents |
+-----+----------+
| 2 | b |
| 100 | aa |
| 200 | bb |
+-----+----------+
3 rows in set (0.02 sec)

Here I asked for records 200, 2, and 100, but, without a ORDER BY clause, the DBMS
returns them in the prder it finds them.

Let's use a support table:

desc sorting_table;
+------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+----------------+
| sort_order | int(11) | NO | PRI | | auto_increment |
| fk_id | int(11) | YES | | | |
+------------+---------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

truncate sorting_table;
insert into sorting_table (fk_id) values (200), (2), (100);
# this will insert our records in the order want them.

select * from sorting_table;
+------------+-------+
| sort_order | fk_id |
+------------+-------+
| 1 | 200 |
| 2 | 2 |
| 3 | 100 |
+------------+-------+
3 rows in set (0.00 sec)


Now we are ready to get the record in our customized order:

select
main_table.*
from
main_table
inner join sorting_table on (id=fk_id)
where
id in (200,100,2)
order by
sort_order;
+-----+----------+
| id | contents |
+-----+----------+
| 200 | bb |
| 2 | b |
| 100 | aa |
+-----+----------+
3 rows in set (0.00 sec)

ciao
gmax

--
_ _ _ _
(_|| | |(_|>< The Data Charmer
_|
http://datacharmer.blogspot.com/
Reply With Quote
Reply
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are Off
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT +1. The time now is 03:53 PM.


Powered by vBulletin® Version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.0.0