2009-09-28 4 views
0

나는 3 개 필드로 구성 테이블,이 :PHP - SQL : 라운드 로빈 방식으로 가져 오는 결과

  • ID
  • 이름
  • 상태

난을받을 때마다 결과, 그것은 나에게 상태 = 1 인 5 개의 이름을 주어야합니다. 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 
,

1 시간 돌려 페치하십시오를, B, D, H, I (5 개 레코드)
2 시간 돌려 페치 : J, K, L, A, B (5 개 레코드)

업데이트 : 전형적인 pagenation을 원하지 않습니다. 나는 A1에서 A12까지 12 개의 이름을 사용할 수 있다고 생각해. 첫 번째 페치는 A1-A5를 반환하고 두 번째 페치 A6-A10을 가져와 세 번째 페치 A11, A12, A1, A2, A3을 반환합니다. 그래서 끝까지 도달하면 처음부터 5 개의 슬롯을 채우기 위해 레코드를 가져와야합니다.

내가 기록의 식별자를 추적 MySQL의

+0

세션별로 또는 "전체적으로"필요합니까? 얼마나 정확하게 "정확해야"합니까 (즉 동시성과 얼마나 많이 걱정해야합니까)? 속도가 문제입니까 (및 얼마나)? – VolkerK

+0

전 세계적으로 concurreny는 문제가 아니므로 최선의 노력을 기울여야합니다. – user177785

답변

0

와 PHP에서 그것을 반환하고있는 중이 야, 다음과 같은 쿼리 수행을 위해 :

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

저는 A1에서 A12까지 12 개의 availabe 이름이 있습니다. 그런 다음 먼저 A1-A5를 반환하고 A6 -A10을 가져오고 세 번째 A11, A12, A1, A2, A3을 가져옵니다. 그래서 내가 끝에 도달하면 frm을 먼저 시작하도록 그림을 그리기 위해 5의 슬롯을 채우십시오. – user177785

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 절의 인덱스를 사용할 수 없지만 임시 테이블과 파일 포트가 필요합니다. 많은 레코드가있는 경우 쿼리가 느려질 수 있습니다. 그게 문제가 아니라면 : 엄지 손가락을 올리십시오. – VolkerK

관련 문제