2009-11-07 86 views
1

查询保持不变,但偏移量不同。如何从表中检索每个第N条记录?

SELECT NAME from tbl WHERE alphabet_index='A' limit 880,1; 
SELECT NAME from tbl WHERE alphabet_index='A' limit 1760,1; 
SELECT NAME from tbl WHERE alphabet_index='A' limit 2640,1; 
.... 
SELECT NAME from tbl WHERE alphabet_index='A' limit 34320,1; 

是否有更好的方法来做到这一点,而不必用不同的偏移量运行N次查询?

更新:我试图建立名称范围作为下钻的索引。所以如果一个alphabet_index有50000个记录,我想显示40个范围,我计算offset = total/rangeCount。我期望的最终结果将是

AA...-AA... 
AA...-AB... 
AB...-AC... 
AC...-AC... 
AD...-AF... 
... 
... 
AW...-AZ... 
+1

你想做什么? – Niyaz 2009-11-07 09:13:44

+0

我想建立一个名称目录。更新说明中的更多详细信息。提前致谢。 – Shoan 2009-11-07 09:24:53

+0

我还应该提到这是一张只读表,并且很少(可能在一个季度中一次)写入。为了避免按名称排序,我更改了表格并按名称排列了记录。 – Shoan 2009-11-07 09:27:13

回答

4

你可以做在像这样的单个查询中改变偏移量查询

select NAME from 
    (select @row:[email protected]+1 as row, t.NAME from 
    tbl t, (select @row := 0) y 
    where alphabet_index='A' order by alphabet_index) z 
where row % 880 = 1; 

这将通过@row变量为每一行添加一个唯一的整数ID。然后它将通过模运算符和该变量选择每行880行。为了获得可重复的行为,需要一个order by子句,否则结果将是有效的随机数。

+0

您的解决方案几乎可以完美工作。我如何确定一个范围的结束和下一个的开始?您的查询生成所有范围的起点。范围的终点将是(行%880)= 0。提前致谢。 – Shoan 2009-11-08 15:41:34

+0

如何在哪里行%880 = 1或行%880 = 0? – 2009-11-08 16:16:38

+0

如果我已经使用“alter table”按名称排序表,是否需要“按字母顺序排序”?非常感谢你的帮助。 – Shoan 2009-11-12 21:19:17

0

像这样:

with x as(
select row_number() over (order by SomeColumn) Id, * 
from MyTable 
) 
select * 
from MyTable 
where Id in (1, 3, 5) 

更新:我的坏,这只能在MSSQL

+1

这在MySql中是否正确? – 2009-11-07 09:22:02

1

为了建立范围的深入分析,我真的取该字段,并获取所有记录。通常,进行多个查询的延迟时间大于提取额外数据所需的时间。它还可以解决另一个问题,即多个查询可能基于不同版本的数据(除非您正在使用事务)。

换句话说,使用非常低的技术解决方案。如果你想进一步优化,使用存储过程,使相同的查询,但是,这样的存储过程,而不是返回为每第N个记录您的代码过滤出来:

http://dev.mysql.com/doc/refman/5.0/en/stored-routines.html