2009-09-28 7 views
0

J'ai une table, qui se compose de 3 champs:PHP - SQL: résultats fetching en mode round robin

  • id
  • Nom
  • état

Chaque fois que je reçois le résultats, il devrait me donner 5 noms dont le statut = 1. Supposons que le db contient les éléments suivants:

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 

premier temps, la récupération doit retourner: A, B, D, H, I (5 entrées)
deuxième temps, la récupération doit retourner: J, K, L, A, B (5 entrées)

UPDATE: Je ne veux pas de pagination typique. Considérons que j'ai 12 noms disponibles de A1 à A12. Le premier aller cherchera A1-A5, le second cherchera A6-A10 et le troisième cherchera A11, A12, A1, A2, A3. Donc, quand j'arrive à la fin, j'ai besoin d'obtenir des enregistrements à partir du premier pour remplir les 5 emplacements.

je le fais en php avec MySQL

+0

Avez-vous besoin de cela sur un niveau par session ou "globalement"? A quel point doit-il être "précis" (c'est-à-dire que vous devez vous préoccuper de la concurrence et de combien)? La vitesse est-elle un problème (et combien)? – VolkerK

+0

globalement, concurreny n'est pas un problème, le meilleur service d'effort est désiré, – user177785

Répondre

0

Gardez une trace des ids des enregistrements renvoyés, et pour les requêtes suivantes ne:

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 
} 

celui-ci utilise la fonctionnalité décalage de mysql - Pensez-y comme pagination pour vos résultats.

+0

je ne veux pas pagenationg en tant que tel. Conserver j'ai 12 noms disponibles de A1 à A12. Ensuite, le premier aller chercher Shold retourne A1-A5, puis récupère A6 -A10 et le troisième récupère A11, A12, A1, A2, A3. Donc, quand j'arrive à la fin j'ai besoin de pic quelques enregistrements en commençant par frm pour que je remplisse la fente de 5 – user177785

1

Cela ressemble à une sorte de script d'attribution de travail?

Vous avez besoin de 2 choses:

  • ID le plus élevé est revenu la dernière fois que le script a été exécuté (lastId)
  • un plus grand nombre que l'ID maximum dans la table (Bignum)

Alors vous pouvez écrire votre requête en tant que

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

Shazaam!

+0

MySQL ne peut pas utiliser un index pour cette clause ORDER BY, mais a besoin d'une table temporaire et d'un fichier. La requête peut devenir lente s'il existe plusieurs enregistrements. Si ce n'est pas un problème: bravo. – VolkerK

Questions connexes