Условие ORDER BY

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

Предположим, мне нужно, чтобы строки с идентификаторами 1,2,3 были главой, остальные отсортированы по дате поля, можно ли сделать что-то вроде:

SELECT * FROM foo ORDER BY id IN (1,2,3), created_date 

Если нет, то что более эффективно? Там будет много строк!

 SELECT *, 0 AS head FROM foo WHERE id IN (1,2,3) UNION SELECT *, 1 AS head FROM foo WHERE id NOT IN (1,2,3) ORDER BY head, created_date 

или

 SELECT *, IF(id IN (1,2,3), 0, 1) AS head ORDER BY head, created_date 

(Я использую MySQL сейчас, но меня интересует любое другое решение SQL.)

Ваш первый пример выглядит почти для меня.

 SELECT * FROM foo ORDER BY id IN (1,2,3) DESC, created_date ASC 

Добавлен DESC потому что id IN (1,2,3) возвращает 1 если true или 0 если false. 1 > 0 , поэтому порядок их в порядке убывания получает желаемый результат.

Добавлен ASC потому что мне нравится быть явным.

Основываясь на ваших более поздних примерах, я думаю, что вам не хватает в том, что, хотя он содержит пробелы, field IN (list) является единственным оператором, который возвращает 0 или 1 . IF(id IN (1,2,3), 0, 1) по своей природе является избыточным.

Таким образом, вам не нужно использовать UNION или сортировать вручную, так как MySQL делает это проще, чем вы даже понимаете 🙂

UNION означает UNION DISTINCT, и это относительно медленно, поскольку он проверяет наличие дубликатов, даже если их не будет. Вы хотите UNION ALL:

 SELECT *, 0 AS head FROM foo WHERE id IN (1,2,3) UNION ALL SELECT *, 1 AS head FROM foo WHERE id NOT IN (1,2,3) ORDER BY head, created_date 

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