MySQL ORDER BY IN()


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

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

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

например:

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

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

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

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

спасибо!

4 55

4 ответа:

Я думаю, что вы можете искать функцию поле -- хотя обычно считается Строковой функцией,она отлично работает и для чисел!

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

вы могли бы использовать FIELD():

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

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

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

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

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

другая возможность (хотя мне это не нравится, я с честью обязан дать вам choice) - это сделать несколько поездок в базу данных, по одному для каждого идентификатора, и обрабатывать их по мере их поступления:

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.

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

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