2013-02-25 4 views
2

У меня есть база данных больших продуктов, и каждый воскресный день мой скрипт активирует 50 новых продуктов. вещь, основанная на некоторых правилах в моем скрипте, я найду некоторые продукты, которые я должен уделить приоритету активации. (для вашего примера, можно сказать, что всегда нужно устанавливать приоритеты активации продуктов с именем «hello kitty» и «meshuggah» в них, прежде чем все остальное).Как я могу отсортировать результат mysql по списку приоритетных идентификаторов?

В моей таблице db содержится информация о продукте и уникальный идентификатор. позволяет сказать, что сценарий находит 5 из этих идентификаторов, получив звание котенка в названии.

поэтому, как я могу сделать запрос, чтобы приоритетные элементы появлялись сверху, а затем следует id desc?

здесь некоторые псевдокод, что им после того, как:

SELECT * FROM products order by (id='59', id='47', id='28', id='29', id='20'), id desc limit 50

результат должен дать мне ID 59, 47, 28, 29 и 20, а затем следуют другие идентификаторы в таблице продуктов, отсортированных по идентификатору по убыванию.

возможно ли это в одном запросе?

ответ

8

использование FIELD

SELECT * 
FROM products 
order by FIELD(id,59,47,28,29,20), id desc 
limit 50 
+0

ах, спасибо, узнайте что-то новое каждый день :) просто нужно было добавить desc за полем, иначе полевые идентификаторы вышли на дно –

+0

@KristianRafteseth это замечательно ': D' –

+0

Обратите внимание, что это работает, потому что FIELD() возвращается 0, если значение 'id' (в данном случае) не найдено. Выполняя порядок DESC, он сортирует нули до нижней части и использует второй поисковый запрос (здесь, 'id'), чтобы отсортировать их. –

1

На самом деле, ваш псевдо-код также приходит довольно близко к такому запросу:

SELECT * 
FROM products 
order by id='59' desc, id='47' desc, id='28' desc, id='29' desc, id='20' desc, id desc 
limit 50 

Это использует тот факт, что условие оценивается в 0 или 1.

Смежные вопросы