Порядок Mysql по определенным значениям идентификатора
Можно ли отсортировать в mysql "order by" с помощью предопределенного набора значений столбца (ID), например: order by (ID = 1,5,4,3), поэтому я бы получил запись 1, 5, 4, 3 в этом порядке?
ОБНОВЛЕНИЕ: О злоупотреблении mysql;-) Я должен объяснить, зачем мне это нужно...
Я хочу, чтобы мои записи меняли сортировку случайным образом каждые 5 минут. У меня есть задача cron, чтобы сделать таблицу обновлений, чтобы поместить в нее другой случайный порядок сортировки. Есть только одна проблема! PAGINATION. У меня будет посетитель, который придет на мою страницу, и я дам ему первые 20 результатов. Он будет ждать 6 минут и перейти на страницу 2, и у него будут неправильные результаты, поскольку порядок сортировки уже изменился.
Итак, я подумал, что если он придет на мой сайт, я поставлю все ID на сеанс, и когда он появится на странице 2, он получит правильные записи, даже если сортировка allready изменилась.
Есть ли другой способ, лучше, сделать это?
Ответы
Ответ 1
Вы можете использовать функцию ORDER BY и FIELD.
См. http://lists.mysql.com/mysql/209784
SELECT * FROM table ORDER BY FIELD(ID,1,5,4,3)
В нем используется функция Field(), которая "возвращает индекс (позицию) str в str1, str2, str3,... list. Возвращает 0, если str не найден" в соответствии с документацией. Таким образом, вы сортируете результирующий набор по возвращаемому значению этой функции, который является индексом значения поля в заданном наборе.
Ответ 2
Вы можете использовать CASE
для этого:
ORDER BY CASE id
WHEN 1 THEN 1
WHEN 5 THEN 2
WHEN 4 THEN 3
WHEN 3 THEN 4
ELSE 5
END
Ответ 3
В официальной документации для mysql об ORDER BY кто-то написал, что вы можете использовать FIELD
для этого, например:
SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)
Это непроверенный код, который теоретически должен работать.
Ответ 4
Есть еще один способ решить эту проблему. Добавьте отдельную таблицу, примерно такую:
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
-statement при изменении ваших критериев заказа - просто измените данные в таблице заказов.
Ответ 5
SELECT * FROM table ORDER BY id = '8' DESC, id = '5' DESC, id = '4' DESC, id = '3' DESC
Если бы у меня было 10 реестров, например, сначала появятся ID 1, 5, 4 и 3, остальные реестры появятся далее.
Нормальная выставка
1
2
3
4
5
6
7
8
9
10
Таким образом
8
5
4
3
1
2
6
7
9
10
Ответ 6
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC
Ответ 7
Если вам нужно сначала указать один идентификатор в результате, используйте идентификатор.
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