Mysql порядок по конкретным значениям идентификатора - PullRequest
76 голосов
/ 30 ноября 2011

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

ОБНОВЛЕНИЕ: О злоупотреблении mysql ;-) Я должен объяснить, зачем мне это нужно ...

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

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

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

Ответы [ 7 ]

157 голосов
/ 30 ноября 2011

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

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

Используется функция Field () , которая «Возвращает индекс (позицию) строки в списке str1, str2, str3, .... Возвращает 0, если строка не найдена» в соответствии с документация. Таким образом, фактически вы сортируете набор результатов по возвращаемому значению этой функции, которое является индексом значения поля в данном наборе.

28 голосов
/ 30 ноября 2011

Вы можете использовать CASE для этого:

ORDER BY CASE id
  WHEN 1 THEN 1
  WHEN 5 THEN 2
  WHEN 4 THEN 3
  WHEN 3 THEN 4
  ELSE 5
END
14 голосов
/ 30 ноября 2011

В официальной документации для mysql о ORDER BY кто-то написал, что вы можете использовать FIELD для этого вопроса, например:

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

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

5 голосов
/ 30 ноября 2011

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

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 утверждение при изменении критериев заказа - просто измените данные в таблице заказов.

3 голосов
/ 05 октября 2016

SELECT * FROM таблицы ORDER BY id = '8' DESC, id = '5' DESC, id = '4' DESC, id = '3' DESC

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

Обычная выставка 1 2 3 4 5 6 7 8 9 10

Таким образом

8 5 4 3 1 2 6 7 9 10

1 голос
/ 24 апреля 2019
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC
0 голосов
/ 03 августа 2018

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

select id,name 
from products
order by case when id=5 then -1 else id end

Если вам нужно начать с последовательности нескольких идентификаторов, укажите коллекцию, аналогичнуюиспользовать с оператором IN.

select id,name 
from products
order by case when id in (30,20,10) then -1 else id end,id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...