Для запису
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
Дерево виразів). В JOIN::prepare
, *order
використовується у функції під назвою setup_order()
. Чому в середині 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)
повторіть спробу.