无需更新数据即可旋转表数据

时间:2010-09-13 07:23:14

标签: mysql oracle sql-server-2000 limit

 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 个答案:

答案 0 :(得分:1)

您可以使用UNION语法执行此操作:

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

这将首先选择限制范围内的行,然后合并第二个选择的剩余部分。请注意,您无需在第二个select语句上设置限制:

  

UNION的默认行为是从结果中删除重复的行。可选的DISTINCT关键字除了默认值之外没有任何影响,因为它还指定了重复行删除。使用可选的ALL关键字,不会发生重复行删除,结果包括所有SELECT语句中的所有匹配行。

答案 1 :(得分:0)

我不认为这可以通过简单的选择(我可能是错的)来实现。我想你需要一个存储过程。

答案 2 :(得分:0)

您已将此标记为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; on第2天,第1天;第10天,第9天;第11天,您应该恢复为0)。您实际上可以使用当前日期,转换为Julian并在除以以下时取余数:limitRows以自动计算:baseRef

(根据需要替换您自己的列和表名称)

答案 3 :(得分:0)

嗯,这个问题的作者可能有点迟,但对人们有用。

简短回答:可以进行&#34;旋转&#34;就像作者问的那样。

答案很长:[我将首先解释MySQL - 我在哪里测试过这个]

让我们想象我们有表 your_table (INT rn,...)。你想要的是以特定的方式排序(&#34;旋转&#34;从rn = N开始)。排序的第一个条件是rn> = N desc。这个想法(至少我如何理解这一点)是我们将订单从 asc 更改为 desc 并将我们的表分成两部分(&lt; N和&gt; = N) 。然后我们按照rn但 asc 顺序重新订购。它将独立地为每个组执行排序。所以这是我们的查询:

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

如果你没有列 - 你总是可以使用参数

的技巧
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。而且我相信你会得到相同的结果(我没有测试过它!)。

希望它有所帮助!