Настроить порядок для запроса выбора MySQL - PullRequest
2 голосов
/ 27 июля 2011

Я хочу сделать что-то вроде этого: select * from table order by id asc за исключением того, что если идентификатор равен 5 (например), сделать его вершиной, в основном 5, тогда все остальные идентификаторы упорядочены как.

Как мне это сделать, пожалуйста?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 27 июля 2011

Вы также можете использовать функцию FIELD():

SELECT *
FROM table
ORDER BY FIELD(id, 5) DESC
       , id ASC

Особенно полезно, если вы хотите иметь первые строки с скажем, id = 5, 23, 17, вы можете использовать:

SELECT *
FROM table
ORDER BY FIELD(id, 17, 23, 5) DESC
       , id ASC
3 голосов
/ 27 июля 2011
SELECT *, CASE WHEN id = 5 THEN -1 ELSE id END AS ordering 
FROM table 
ORDER BY ordering ASC
3 голосов
/ 27 июля 2011

Вы можете использовать UNION, как я изначально предложил, с сортировкой по обоим столбцам, как предложено @Mike в комментариях.

(SELECT *, 1 single_id FROM table_name WHERE id = 5)
UNION ALL
(SELECT *, 2 all_ids FROM table_name WHERE id <> 5)
ORDER BY single_id, id

Или лучше с оператором IF, чтобы избежать накладных расходов двух видов:

  SELECT *, IF(id = 5, -1, id) ordering 
    FROM table_name
ORDER BY ordering ASC
2 голосов
/ 27 июля 2011
SELECT * FROM table_name ORDER BY id=7 DESC, id ASC

Поскольку для этого не используются индексы, я не рекомендую использовать его для больших таблиц.

...