views:

55

answers:

4

I have a query like this

SELECT *
  FROM test JOIN test2 ON test.id=test2.id
 WHERE test.id IN (562,553,572)
 GROUP BY test.id

Its results are ordered like this: 553, 562, 572...

But I need the same order that I specified in the IN(562,553,572) condition. How can I do that?

+2  A: 

ORDER BY CASE test.id WHEN 562 THEN 0 WHEN 553 THEN 1 WHEN 572 THEN 2 END

a1ex07
+2  A: 

One way is like this:

SELECT *
  FROM test JOIN test2 ON test.id=test2.id
 WHERE test.id IN (562,553,572)
 ORDER BY CASE test.id
          WHEN 562 THEN 1
          WHEN 553 THEN 2
          WHEN 572 THEN 3
          ELSE          4
          END;

You don't need GROUP BY unless you are computing aggregates. The ELSE clause is superfluous here, but it is generally a good idea to include it.

Jonathan Leffler
How different is this from the `FIELD` function? SQL standards?
Nirmal
@Nirmal: yes - I don't know which DBMS support the FIELD function (but it certainly isn't all of them); OTOH, I don't know of a DBMS that does not support CASE.
Jonathan Leffler
+9  A: 

You can do this using FIELD():

SELECT ... ORDER BY FIELD(`test`.`id`, 562, 553, 572)
deceze
+2  A: 

Could do something with FIND_IN_SET():

SELECT * 
  FROM test 
   JOIN test2 
   ON test.id = test2.id
  WHERE test.id IN (562,553,572)
  ORDER BY FIND_IN_SET(test.id, '562,553,572');
CastroXXL
Thank you sir :-)
learner