Порядок Mysql по определенным значениям ID


можно ли сортировать в mysql по "порядку", используя предопределенный набор значений столбцов (ID), например: order by (ID=1,5,4,3), поэтому я бы получил запись 1, 5, 4, 3 в этом порядке?

обновление: о злоупотреблении mysql ;-) я должен объяснить, почему мне это нужно...

Я хочу, чтобы мои записи менялись случайным образом каждые 5 минут. У меня есть задача cron, чтобы сделать таблицу обновления, чтобы поместить в нее другой, случайный порядок сортировки. Есть только одна проблема! ПАГИНАЦИЯ. У меня будет посетитель, который заходит на мою страницу и я дал ему первые 20 результатов. Он подождет 6 минут и перейдет на страницу 2, и у него будут неправильные результаты, поскольку порядок сортировки уже изменился.

поэтому я подумал, что если он придет на мой сайт, я помещу все идентификаторы в сеанс, и когда он находится на странице 2, он получит правильные записи, даже если сортировка уже изменилась.

есть ли другой способ лучше, чтобы сделать это?

6 67

6 ответов:

вы можете использовать функцию ORDER BY и FIELD. См.http://lists.mysql.com/mysql/209784

SELECT * FROM table ORDER BY FIELD(ID,1,5,4,3)

Он использует

вы должны быть в состоянии использовать CASE для этого:

ORDER BY CASE id
  WHEN 1 THEN 1
  WHEN 5 THEN 2
  WHEN 4 THEN 3
  WHEN 3 THEN 4
  ELSE 5
END

по официальной документации для mysql о ПРИКАЗОМ, кто-то написал, что вы можете использовать FIELD по этому поводу, вот так:

SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)

это непроверенный код, который теоретически должен работать.

есть еще один способ решить эту проблему. Добавить отдельную таблицу, что-то вроде этого:

CREATE TABLE `new_order` (
  `my_order` BIGINT(20) UNSIGNED NOT NULL,
  `my_number` BIGINT(20) NOT NULL,
  PRIMARY KEY (`my_order`),
  UNIQUE KEY `my_number` (`my_number`)
) ENGINE=INNODB;

эта таблица теперь будет использоваться для определения вашего собственного механизма заказа.

добавьте туда свои значения:

my_order | my_number
---------+----------
       1 |         1
       2 |         5
       3 |         4
       4 |         3

...а затем измените инструкцию SQL при присоединении к этой новой таблице.

SELECT *
FROM your_table AS T1
INNER JOIN new_order AS T2 on T1.id = T2.my_number
WHERE ....whatever...
ORDER BY T2.my_order; 

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

выберите * из таблицы ORDER by id= ' 8 'DESC, id=' 5 'DESC, id=' 4 ' DESC, id=' 3 ' DESC

Если у меня было 10 реестров, например, таким образом, сначала появится идентификатор 1, 5, 4 и 3, затем появятся другие реестры.

нормальная выставка Один Два Три Четыре Пять Шесть Семь Восемь Девять 10

с

8 Пять Четыре Три Один Два Шесть Семь Девять 10

Если у вас есть один идентификатор заказа, то используйте это

выберите id, имя из продуктов порядок по случаю, когда id=5, то -1 еще id end

Если у вас есть несколько, то используйте это

выберите id, имя из продуктов того случая, когда ID в (30,20,10) тогда -1 иначе идентификатор концов,идентификатор