Можно ли сортировать в mysql по «порядку по», используя предопределенный набор значений столбца (ID), например: порядок по (ID = 1,5,4,3), чтобы я получил запись 1, 5, 4, 3 в этом заказать?
ОБНОВЛЕНИЕ: о злоупотреблении mysql ;-) Я должен объяснить, зачем мне это нужно ...
Я хочу, чтобы мои записи менялись случайным образом каждые 5 минут. У меня есть задача cron, чтобы сделать таблицу обновлений, чтобы поместить в нее другой случайный порядок сортировки. Есть только одна проблема! СТРАНИЦА. У меня будет посетитель, который зайдет на мою страницу, и я дам ему первые 20 результатов. Он подождет 6 минут и перейдет на страницу 2, и у него будут неправильные результаты, поскольку порядок сортировки уже изменился.
Поэтому я подумал, что если он зайдет на мой сайт, я помещу все идентификаторы в сеанс, и когда он будет на странице 2, он получит правильные записи, даже если сортировка уже изменилась.
Есть ли другой способ лучше сделать это?
Ответы:
Вы можете использовать функции 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, .... Возвращает 0, если str не найдена" согласно документации. Фактически вы сортируете набор результатов по возвращаемому значению этой функции, которое является индексом значения поля в данном наборе.
источник
Вы должны уметь использовать
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 о ORDER BY кто-то опубликовал, что вы можете использовать
FIELD
для этого, например:SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)
Это непроверенный код, который теоретически должен работать.
источник
SELECT * FROM table 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
источник
Есть другой способ решить эту проблему. Добавьте отдельную таблицу, примерно так:
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
-запись при изменении критериев вашего заказа - просто измените данные в таблице заказов.источник
Если вам нужно сначала заказать в результате один идентификатор, используйте идентификатор.
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
источник
Если вы хотите, чтобы один идентификатор был последним в результате, используйте порядок по регистру. (Например: вы хотите, чтобы в последнем списке отображался вариант «Другой», а весь список городов отображался в алфавитном порядке.)
select id,city from city order by case when id = 2 then city else -1 end, city ASC
Например, если у меня было 5 городов, я хочу показать город в алфавитном порядке с последним отображением опции «другой» в раскрывающемся списке, тогда мы можем использовать этот запрос. см. пример, другие показаны в моей таблице по второму идентификатору (id: 2), поэтому я использую «when id = 2» в приведенном выше запросе.
запись в таблице БД:
мой вывод:
источник
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC
источник
ASC OR DESC
это правильный синтаксисFIELD
функцию, которая идентична принятому ответу за 8 лет до этого.