I\'m hoping to sort the items returned in the following query by the order they\'re entered into the IN() function.
INPUT:
SELECT id
just use
order by INSTR( ',B,C,D,A,' , concat(',' , `field`, ',' ) )
avoid the situation like
INSTR('1,2,3,11' ,`field`)
will end with unordered result row : 1 and 11 alternant
SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')
The FIELD function returns the position of the first string in the remaining list of strings.
However, it is much better performance-wise to have an indexed column that represents your sort order, and then sort by this column.
May be this can help someone (p_CustomerId is passed in SP):
SELECT CompanyAccountId, CompanyName
FROM account
LEFT JOIN customer where CompanyAccountId = customer.AccountId
GROUP BY CompanyAccountId
ORDER BY CASE WHEN CompanyAccountId IN (SELECT AccountId
FROM customer
WHERE customerid= p_CustomerId)
THEN 0
ELSE 1
END, CompanyName;
Description: I want to show the account list. Here i am passing a customer id in sp. Now it will list the account names with accounts linked to that customers are shown at top followed by other accounts in alphabetical order.
Try something like
... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...
You need another column (numeric) in your table, in which you specify the sort order. The IN clause doesn't work this way.
B - 1
A - 2
D - 3
E - 4
C - 5
Another option from here: http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html
select *
from tablename
order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;
So in your case (untested) would be
SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY name = 'B', name = 'A', name = 'D', name = 'E', name = 'C';
Depending what you're doing I've found it a bit quirky but always got it to work after playing with it a bit.