Обратный «естественный порядок» таблицы MySQL без ORDER BY?

Я имею дело с устаревшей таблицей базы данных, в которой нет столбца даты вставки или столбца уникального идентификатора, однако естественный порядок вставки все еще действителен при рассмотрении с простымSELECT * показывая самое старое к новейшему.

Я хотел бы получить эти данные с нумерацией страниц, но изменить порядок, как если бы это былоORDER BY date DESC

Я думал об упаковке запроса, присвоении числового идентификатора результирующим строкам, а затем сделатьORDER BY на результат, но вау, что кажется сумасшедшим.

Есть ли более простое решение, которое я пропускаю?

Я не могу добавить столбцы в существующую таблицу, я должен работать с ней как есть.

Спасибо за любые идеи!

 Spudley23 сент. 2010 г., 16:07
Уч. Это звучит как миссия невыполнима. Я был бы очень заинтересован, если кто-нибудь может придумать работоспособное решение, хотя.
 Brilliand14 янв. 2014 г., 01:43
У меня есть связанная ситуация, когда у таблицы действительно есть метка времени, но несколько строк могут быть вставлены в одну и ту же секунду. Это таблица регистрации / аудита, поэтому не существует правила, согласно которому каждая строка должна быть уникальной, не говоря уже об уникальном естественном ключе. Когда я сортирую по метке времени, меня иногда смущает порядок событий в одну и ту же секунду.
 Ivan Nevostruev23 сент. 2010 г., 16:07
Вы бы лучше добавить ПЕРВИЧНЫЙ ключ к таблице. SQL не гарантирует определенного порядка записей в таблице. Когда заказ будет нарушен, вы все равно добавите ключ. Таким образом, чем быстрее вы это сделаете, тем больше времени вы сэкономите в будущем.

Ответы на вопрос(2)

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

Если у вас слишком много записей, вы можете вместо этого использовать представление. Это объект базы данных, который может использоваться для объединения данных из разных таблиц или для представления измененного представления одной таблицы, помимо прочего. В этом случае вы можете попробовать создать представление вашей таблицы и добавить сгенерированный столбец идентификаторов. Затем вы можете запустить операторы SELECT в этом порядке упорядочения по добавленному вами новому столбцу.

Однако следует помнить о совете другого автора выше: порядок, в котором строки возвращаются без предложения ORDER BY, является произвольным и может изменяться без уведомления. Было бы лучше изменить вашу таблицу, если это вообще возможно.

Синтаксис mySQL CREATE VIEW

 ck_23 сент. 2010 г., 16:37
Не могли бы вы рассказать об этой марке? Я не знаком с термином "взгляд" по отношению к MySQL?
 Mark Chorley23 сент. 2010 г., 16:34
Возможно, используйте представление, чтобы добавить сгенерированный ключ, если вы действительно не можете изменить исходную таблицу.
 ck_23 сент. 2010 г., 17:30
Ах, спасибо. Но я также ограничен совместимостью с MySQL 4, к сожалению.
 Mark Chorley23 сент. 2010 г., 17:08
Я расширил свой ответ некоторыми деталями просмотров
 ck_23 сент. 2010 г., 16:17
Правильно, по моим размышлениям в конце оригинального вопроса. Но посмотрите, вот в чем дело, могут быть сотни, тысячи записей, в то время как я в основном заинтересован в отображении последних нескольких десятков записей. Я мог бы использовать переменные mysql и создать счетчик для каждой строки, а затем обернуть эти строки с помощью разбитого на страницы запроса и ORDER DESC, но это полностью отрицает эффективность и то, чего я специально пытаюсь избежать.
Решение Вопроса

а затем упорядочите их по порядку @rownum. Вотпример.

select @rownum:[email protected]+1 ‘rank’, p.* from player p, (SELECT @rownum:=0) r order by score desc limit 10;

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

 ck_23 сент. 2010 г., 17:43
Да, я понимаю. И я только что проверил это, и это, кажется, работает хорошо. Под циклом я подразумевал, что mysql должен будет потянуть ВСЕ строки, чтобы пронумеровать их, а затем перейти к последним 10 (например, если это желаемая нумерация страниц).
 Cory House23 сент. 2010 г., 17:42
Решение, которое я предлагаю, не требует зацикливания. Данные извлекаются прямо из БД в нужном порядке.
 ck_23 сент. 2010 г., 17:33
Ах, это практический пример того, о чем я размышлял в середине моего вопроса. Спасибо. Однако я боюсь, что в какой-то момент таблица может быть довольно большой, и цикл по всем строкам может сильно снизить производительность. Тем не менее, это может быть единственный путь.

Ваш ответ на вопрос