2009-11-07 89 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