2009-09-28 51 views
0

我有一個表,其中包括3場:PHP - SQL:輪循方式抓取結果

  • ID
  • 狀態

每次我得到的結果,它應該給我5個狀態= 1的名字。 假設db包含以下內容:

id name status 
1 A 1 
2 B 1 
3 C 0 
4 D 1 
5 E 0 
6 F 0 
7 H 1 
8 I 1 
9 J 1 
10 K 1 
11 L 1 
12 M 0 

第一時間,取應該返回:A,B,d,H,I(5個記錄)
第二時間,取應該返回:J,K,L,A,B(5個記錄)

更新:我不想要典型的網頁。考慮我從A1到A12有12個可用的名稱。第一次提取應該返回A1-A5,第二次提取A6-A10和第三次提取A11,A12,A1,A2,A3。所以當我到達最後時,我需要從第一個開始填充5個插槽。

我與MySQL的

+0

你需要在每個會話級別或「全局」?它有多「準確」(即你是否擔心併發和多少)?速度是一個問題(和多少)? – VolkerK 2009-09-28 22:31:22

+0

全球性,concurreny不是問題,盡力而爲服務是需要的, – user177785 2009-09-28 22:49:21

回答

0

做它在PHP跟蹤記錄的ID的返回,以下查詢肯定:

select top 5 * 
from (
    select top 5 * 
    from MyTable 
    where status = 1 
     and id not in (1,2,4,7,8) 
    order by name 
    union 
    select top 5 * 
    from MyTable 
    where status = 1 
    order by name 
) a 
0
$q = mysql_query("SELECT name FROM table WHERE status = 1 LIMIT 5); 
while ($row = mysql_fetch_row($q)) 
{ 
    .... //first 5 
} 
$q = mysql_query("SELECT name FROM table WHERE status = 1 LIMIT 5,5); 
while ($row = mysql_fetch_row($q)) 
{ 
    .... //second 5 
} 

此使用MySQL的偏移功能 - 把它想象成你的結果的分頁。

+0

我不想要pagenationg as.Consder我有12 availabe名稱從A1到A12。然後首先取回退回A1-A5,再取回A6 -A10和第三取A11,A12,A1,A2,A3。所以當我到達結束時,我需要先拍攝一些記錄首先frm,以便我填充5 – user177785 2009-09-28 22:52:16

1

這看起來像某種作業分配腳本?

您需要兩兩件事:

  • 最高的ID返回最後一次運行腳本(lastID)
  • 一些比最大ID較大的表(BIGNUM)

那麼你可以寫你的查詢爲

SELECT 
    id, name 
FROM 
    table 
WHERE 
    status=1 
ORDER BY 
    (bignum + id) MOD (bigNum + lastID + 1) 
LIMIT 5 

Shazaam!

+0

的插槽MySQL不能使用此ORDER BY子句的索引,但需要一個臨時表和filesort。如果有許多記錄,查詢可能會變慢。如果這不是問題:豎起大拇指。 – VolkerK 2009-09-29 07:56:44