Для записи
SELECT * FROM mytable WHERE id IN (1,2,3,4) ORDER BY FIELD(id,3,2,1,4);
должно работать так же, потому что вам не нужно упорядочивать список в WHERE
пункте
Что касается того, как это работает,
FIELD () - это функция, которая возвращает позицию индекса в списке с разделителями-запятыми, если искомое значение существует.
- Если id = 1, то FIELD (id, 3,2,1,4) возвращает 3 (позиция, где 1 находится в списке)
- Если id = 2, то FIELD (id, 3,2,1,4) возвращает 2 (позиция, где 2 находится в списке)
- Если id = 3, то FIELD (id, 3,2,1,4) возвращает 1 (позиция, где 3 находится в списке)
- Если id = 4, то FIELD (id, 3,2,1,4) возвращает 4 (позиция, где 4 находится в списке)
- Если id = что-то еще, то FIELD (id, 3,2,1,4) возвращает 0 (нет в списке)
Эти ORDER BY
значения вычисляются по какому полю () возвращает
Вы можете создавать всевозможные модные заказы
Например, используя функцию IF ()
SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0),FIELD(id,3,2,1,4);
Это приведет к тому, что первые 4 идентификатора появятся вверху списка, в противном случае он появится внизу. Зачем?
В ORDER BY
, вы либо получите 0 или 1.
- Если первый столбец равен 0, отобразить любой из первых 4 идентификаторов
- Если первый столбец равен 1, сделайте его появившимся потом
Давайте перевернем это с DESC в первом столбце
SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0) DESC,FIELD(id,3,2,1,4);
В ORDER BY
, вы все равно либо получите 0 или 1.
- Если первый столбец равен 1, сделайте что угодно, кроме первых 4 идентификаторов.
- Если первый столбец равен 0, первые 4 идентификатора отображаются в исходном порядке.
ВАШ АКТУАЛЬНЫЙ ВОПРОС
Если вы серьезно хотите узнать об этом, перейдите на страницы 189 и 192 Книги.
для настоящего глубокого погружения.
По сути, существует класс C ++, который называется ORDER *order
( ORDER BY
Дерево выражений). In JOIN::prepare
, *order
используется в вызываемой функции setup_order()
. Почему в середине JOIN
класса? Каждый запрос, даже запрос к одной таблице, всегда обрабатывается как JOIN (см. Мой пост. Есть ли разница в выполнении между условием JOIN и условием WHERE? )
Исходный код для всего этого sql/sql_select.cc
Очевидно, ORDER BY
дерево собирается провести оценку FIELD(id,3,2,1,4)
. Таким образом, числа 0,1,2,3,4 являются значениями, сортируемыми при переносе ссылки на соответствующую строку.
SELECT *, FIELD(id,3,2,1,4) AS f FROM mytable WHERE id IN (3,2,1,4);
затем добавьтеORDER BY f
илиORDER BY FIELD(id,3,2,1,4)
и попробуйте снова.