Порядок SQL-запроса "WHERE field IN"? - PullRequest
5 голосов
/ 25 октября 2010

Я использую следующий SQL для выбора записей из базы данных MySQL:

SELECT * FROM cms_product WHERE id IN (3,22,1);

Порядок результатов равен "ORDER BY id ASC", поэтому в примере возвращаются записи 1,3,22.Как я могу заказать их точно так, как указано в предложении IN?Так заказали как 3,22,1?Спасибо.

Ответы [ 5 ]

7 голосов
/ 25 октября 2010

Многочисленные опции -

CASE:

Предпочтительнее, поскольку ANSI-92 является переносимым на другие базы данных.

  SELECT * 
    FROM cms_product 
   WHERE id IN (3,22,1)
ORDER BY CASE id
           WHEN 3 THEN 1
           WHEN 22 THEN 2
           WHEN 1 THEN 3
         END

FIND_IN_SET:

  SELECT * 
    FROM cms_product 
   WHERE id IN (3,22,1)
ORDER BY FIND_IN_SET(id, '3,22,1');

ПОЛЯ:

  SELECT * 
    FROM cms_product 
   WHERE id IN (3,22,1)
ORDER BY FIELD(id, 3, 22, 1);

Ссылка:

6 голосов
/ 25 октября 2010

Попробуйте использовать ORDER BY FIELD, например:

SELECT * FROM cms_product WHERE id IN (3,22,1) ORDER BY FIELD (id, 3, 22, 1);

источник здесь

1 голос
/ 25 октября 2010

Это может быть не очень аккуратно, но вы можете сделать следующее:

SELECT    * 
FROM      cms_product 
WHERE     id IN (3, 22, 1)
ORDER BY  id = 3 DESC, id = 22 DESC, id = 1 DESC;

Контрольный пример:

CREATE TABLE cms_product (id int, value int);

INSERT INTO cms_product VALUES (1, 100);
INSERT INTO cms_product VALUES (3, 200);
INSERT INTO cms_product VALUES (22, 300);

Результат:

+------+-------+
| id   | value |
+------+-------+
|    3 |   200 |
|   22 |   300 |
|    1 |   100 |
+------+-------+
3 rows in set (0.02 sec)

UPDATE:

... ORDER BY FIELD (id, 3, 22, 1), как предложено @ Dave и @ OMG Ponies , возвращает те же результаты и на самом деле намного аккуратнее.

0 голосов
/ 25 октября 2010

ЗАКАЗ ПО ПОЛЯМ (id, '3', '22', '1') ???

0 голосов
/ 25 октября 2010

Вы не можете, это должен быть ASC или DESC.

...