Поворот данных таблицы без обновления данных - PullRequest
2 голосов
/ 13 сентября 2010
 SELECT * FROM `your_table` LIMIT 0, 10 

-> Это отобразит первый 1,2,3,4,5,6,7,8,9,10

 SELECT * FROM `your_table` LIMIT 5, 5 

-> Это покажет записи 6, 7, 8, 9, 10

Я хочу показать данные 2,3,4,5,6,7,8,9,10,1 и на следующий день 3,4,5,6,7,8,9,10,1,2 послезавтра 4,5,6,7,8,9,10,1,2,3

ЭТО ВОЗМОЖНО без обновления каких-либо данных этой таблицы ???

Ответы [ 4 ]

1 голос
/ 13 сентября 2010

Вы можете сделать это, используя синтаксис UNION :

SELECT * FROM `your_table` LIMIT 5, 5 UNION SELECT * FROM `your_table`

Это сначала выберет строки в пределах вашего лимита, а затем объединит остаток от второго выбора. Обратите внимание, что вам не нужно устанавливать ограничение для второго оператора выбора:

Поведение по умолчанию для UNION состоит в том, что повторяющиеся строки удаляются из результата. Необязательное ключевое слово DISTINCT не имеет никакого эффекта, кроме значения по умолчанию, поскольку оно также указывает удаление дублирующихся строк. При использовании необязательного ключевого слова ALL удаление повторяющихся строк не происходит, и результат включает все совпадающие строки из всех операторов SELECT.

0 голосов
/ 16 февраля 2016

Ну, это может быть немного поздно для автора вопроса, но может быть полезно для людей.

Краткий ответ : Возможно сделать "вращение"как спросил автор.

Длинный ответ : [Сначала я собираюсь объяснить для MySQL - где я это проверял]

Давайте представим, что у нас есть таблица your_table (INT rn, ...).То, что вы хотите, это сортировать определенным образом («вращаться», начиная с rn = N).Первым условием упорядочения является rn> = N desc.Идея (по крайней мере, насколько я понимаю это) состоит в том, что мы меняем порядок с asc на desc и разделяем нашу таблицу на две части (= N).Затем мы заказываем это обратно по rn, но asc order.Он выполнит сортировку для каждой группы независимо.Итак, вот наш запрос:

select * from your_table where rn between 1 and 10
order by rn >= N desc, rn asc;

Если у вас нет столбца rn - вы всегда можете использовать трюк с параметром

select t.*, @rownum := @rownum + 1 AS rn 
from your_table t,
(SELECT @rownum := 0) r
where @rownum < 10 /* here be careful - we already increased by 1 the rownum */
order by @rownum >=N - 1 desc, /* another tricky place (cause we already increased rownum) */
         @rownum asc;

Я не знаю, последний лиоднако эффективен.

Для Oracle вы всегда можете использовать rownum .И я верю, что у вас будет тот же результат (я его не проверял!).

Надеюсь, это поможет!

0 голосов
/ 13 сентября 2010

Вы пометили это как Oracle, хотя ваш синтаксис SQL был бы недействительным для Oracle, потому что он не поддерживает LIMIT

Однако вот решение, которое будет работать в Oracle:

select *
  from ( select rownum as rn,
                user_id
           from admin_user
          order by user_id
       ) X
 where X.rn > :startRows
   and X.rn <= :startRows + :limitRows
 order by case when X.rn <= :baseRef
                    then X.rn + :limitRows
               else
                    X.rn
          end ASC
;

где: startRows и: limitRows - это значения для вашего LIMIT, а: baseRef - это значение в диапазоне от 0 до: limitRows-1, которое следует увеличивать / циклически выполнять ежедневно (т. Е. В день 1 оно должно быть 0;день 2, 1; в день 10, 9; в день 11 вы должны вернуться к 0).На самом деле вы можете использовать текущую дату, преобразованную в юлианскую и взять остаток при делении на: limitRows для автоматизации расчета: baseRef

(при необходимости подставьте собственные столбцы и имена таблиц)

0 голосов
/ 13 сентября 2010

Я не думаю, что это может быть достигнуто с помощью простого выбора (я могу ошибаться).Я думаю, вам понадобится хранимая процедура.

...