MySQL ORDER BY IN () - PullRequest
       11

MySQL ORDER BY IN ()

62 голосов
/ 26 августа 2009

У меня есть массив PHP с номерами ID в нем. Эти номера уже заказаны.

Теперь я хотел бы получить свой результат с помощью метода IN (), чтобы получить все идентификаторы.

Однако эти идентификаторы должны быть упорядочены как в методе IN.

Например:

IN(4,7,3,8,9)  

Должен дать результат как:

4 - Article 4  
7 - Article 7  
3 - Article 3  
8 - Article 8  
9 - Article 9

Есть предложения? Может быть, есть функция для этого?

Спасибо!

Ответы [ 4 ]

138 голосов
/ 26 августа 2009

Я думаю, что вы, возможно, ищете функцию FIELD - хотя обычно ее рассматривают как строковую функцию, она отлично работает и для чисел!

ORDER BY FIELD(field_name, 3,2,5,7,8,1)
8 голосов
/ 26 августа 2009

Вы можете использовать FIELD():

ORDER BY FIELD(id, 3,2,5,7,8,1)

Возвращает индекс (позицию) str в списке str1, str2, str3, .... Возвращает 0, если str не найден.

Хотя это своего рода уродливый хак, поэтому используйте его, только если у вас нет другого выбора. Сортировка вывода в вашем приложении может быть лучше.

0 голосов
/ 26 августа 2009

Стандартный SQL не предоставляет способа сделать это (MySQL может, но я предпочитаю решения, которые не зависят от поставщика, поэтому я могу переключать СУБД в любое время).

Это то, что вы должны делать в постобработке после возвращается набор результатов. SQL может возвращать их только в порядке, указанном в предложении «order by» (или в любом порядке, если такого предложения нет).

Другая возможность (хотя мне это не нравится, я обязан предоставить вам выбор) состоит в том, чтобы совершить несколько поездок в базу данных, по одной для каждого идентификатора, и обрабатывать их по мере их поступления: 1009 *

select * from tbl where article_id = 4;
// Process those.
select * from tbl where article_id = 7;
// Process those.
: : : : :
select * from tbl where article_id = 9;
// Process those.
0 голосов
/ 26 августа 2009

Вам просто нужно дать правильный заказ по заявлению.

SELECT ID FROM myTable WHERE ID IN(1,2,3,4) ORDER BY ID

Почему вы хотите, чтобы ваши данные были упорядочены неупорядоченно, как в вашем примере?

Если вы не против объединения длинных запросов, попробуйте так:

SELECT ID FROM myTable WHERE ID=1
UNION
SELECT ID FROM myTable WHERE ID=3
UNION
SELECT ID FROM myTable WHERE ID=2
...