MySQL Заказать по справке! - PullRequest
6 голосов
/ 07 ноября 2010

Я хочу сделать заказ в определенном порядке.Я знаю, что могу изменить всю базу данных, но тогда мне нужно будет изменить всю базу кода.

У меня есть столбец в таблице «игры», называемый «статус».

Итак ...

  SELECT * 
    FROM games 
ORDER BY status ASC  -- Will retrieve results going from 0 then 1 then 2

То, что я ищу, - это возможность заказать его по 1, затем по 0, затем по 2.

Любые идеи ???

Ответы [ 4 ]

4 голосов
/ 07 ноября 2010

Если я правильно понимаю, используя CASE выражение :

  SELECT g.* 
    FROM GAMES g
ORDER BY CASE g.status 
           WHEN 0 THEN 1
           WHEN 1 THEN 2
           WHEN 2 THEN 3
         END

Используя FIND_IN_SET функцию :

  SELECT g.* 
    FROM GAMES g
ORDER BY FIND_IN_SET(g.status, '0,1,2')

Используя ПОЛЕ функция :

  SELECT g.* 
    FROM GAMES g
ORDER BY FIELD(g.status, 0, 1, 2)
2 голосов
/ 07 ноября 2010

Вы можете использовать FIELD ():

SELECT *
FROM games
ORDER BY FIELD(status, 1, 0, 2)

Но может быть лучше объяснить немного больше, что вы хотите сделать, то есть, что содержит ваша таблица.

0 голосов
/ 07 ноября 2010

Другим вариантом будет наличие таблицы проверки для столбца состояния, которая называется что-то вроде VAL_GAME_STATUS. GAMES.STATUS будет внешним ключом для VAL_GAME_STATUS, а VAL_GAME_STATUS migt будет выглядеть как

CREATE TABLE VAL_GAME_STATUS  -- Oracle format - modify as needed for other DB
  (STATUS      NUMBER PRIMARY KEY,
   DESCRIPTION VARCHAR2(50) NOT NULL UNIQUE,
   SORT_ORDER  NUMBER NOT NULL UNIQUE);

Учитывая это, запрос на выборку отсортированных результатов из GAMES становится

SELECT g.*
  FROM GAMES g
INNER JOIN VAL_GAME_STATUS s
  USING (STATUS)
ORDER BY s.SORT_ORDER;

Недостатком здесь является то, что вам нужно выполнить объединение для сортировки данных, но это незначительный удар, поскольку VAL_GAME_STATUS - это небольшая таблица, которая, вероятно, может храниться в памяти. Преимущество состоит в том, что вы можете изменить порядок сортировки на лету, не касаясь вашего кода. Добавление новых значений статуса с соответствующим порядком сортировки также легко выполняется.

Делись и наслаждайся.

0 голосов
/ 07 ноября 2010

Я собирался опубликовать тот же метод, что и OMG Ponies, так что +1 там. Вот полезный сайт, где я изучил эту технику:

http://www.shawnolson.net/a/722/mysql-arbitrary-ordering.html

...