2011-07-20 5 views
1

Je ne sais pas exactement comment cela s'appelle mais je vais essayer de décrire aussi bien que possible ce que je veux réaliser. Donc, tout d'abord, il y a une variable, appelée $id, qui est actuellement $_GET['id']. En supposant que l'utilisateur entre la page suivante en demandant: /page.php?id=6. Maintenant, ce que je dois faire est de fournir les informations sur les 3 prochaines pages de la base de données. Voici la base de données: AlorsBoucler les résultats de MySQL

TABLE `pages` 

    id | page_name 
    ______________________ 
    1 | AAAAA 
    2 | BBBBB 
    3 | CCCCC 
    4 | DDDDD 
    5 | EEEEE 
    6 | FFFFF 
    7 | GGGGG 
    8 | HHHHH 
    9 | IIIII 

, tout en demandant la page avec identifiant 6, le script suivant renvoie les 3 pages suivantes (7,8,9):

$res = mysql_query("SELECT * FROM `pages` WHERE `id`>'".intval($id)."' ORDER BY `id` DESC LIMIT 3"); 
while($arr = mysql_fetch_assoc($res)) 
{ 
     print("Page ID: ".$arr['id']."; Page Name: ".$arr['page_name']."\n"); 
} 

Et est ici la sortie :

Page ID: 7; Page Name: GGGGG 
Page ID: 8; Page Name: HHHHH 
Page ID: 9; Page Name: IIIII 

Et cela fonctionne bien jusqu'à ce que la $id est supérieure à 6. Quand il est (/page.php?id={7/8/9}), la sortie ne montre pas 3 pages plus, mais 2 pages, 1 pag e et respectivement pas de sortie lorsque $id est 9. Donc, ma question est: Y at-il un moyen de revenir en arrière et de commencer dès le début quand il n'y a pas assez de résultats (moins de 3) à afficher?

  • Lorsque vous accédez à /page.php?id=8, la sortie devrait contenir des pages avec id 9, 1 et 2.
  • Lors de l'accès /page.php?id=9, la sortie doit contenir des pages avec l'ID 1, 2, 3.
  • Lors de l'accès /page.php?id=3, la sortie doit contenir des pages avec l'ID 4, 5, 6 et ainsi de suite.
+2

Vous voulez dire autre que l'exécution de la requête une seconde fois sans condition WHERE et une LIMITE basée sur le nombre de résultats obtenus la première fois? – Oswald

Répondre

4
(SELECT *, 0 AS custom_order FROM `pages` WHERE `id`>'".intval($id)."' ORDER BY `id` ASC LIMIT 3) 
UNION ALL 
(SELECT *, 1 AS custom_order FROM `pages` ORDER BY `id` ASC LIMIT 3) 
ORDER BY custom_order, id ASC 
LIMIT 3 

De cette façon, vous obtenez toujours 3 pages. Si pas assez de pages suivantes, vous obtiendrez jusqu'à 3 dès le début.

+0

est-ce plus efficace que d'exécuter une deuxième requête basée sur le nombre de résultats obtenus par le premier? – technology

+0

Oui, c'est sûr. –

+0

merci, cela fonctionne très bien. il y a une faute de frappe sur la 4ème ligne, 'custom_orer' devrait être orDer. – technology

0

Vous pouvez modifier la requête pour être quelque chose comme:

select * from 
    (select *, id-$inval($id) as order_by 
     from pages were id > $inval($id) order by id asc limit 3 
     union 
     select *, id as order_by 
     from pages order by id asc limit 3) as pages 
order by order_by asc 
0

Je résoudre cette façon (un problème possible est que le resultset pourrait contenir au plus 6 enregistrements au lieu de 3):

$res = mysql_query("(SELECT * FROM `pages` WHERE `id`>'".intval($id)."' ORDER BY `id` ASC LIMIT 3) UNION DISTINCT (SELECT * FROM `pages` WHERE id>0 ORDER BY id ASC LIMIT 3)"); 
$counter = 0; 
while($arr = mysql_fetch_assoc($res) && $counter<3) 
{ 
     $counter++; 
     print("Page ID: ".$arr['id']."; Page Name: ".$arr['page_name']."\n"); 
} 
Questions connexes