SQL LIMIT OFFSET [Résolu]

Messages postés
143
Date d'inscription
samedi 4 janvier 2003
Dernière intervention
19 mai 2015
- - Dernière réponse : cs_SkyCrasher
Messages postés
143
Date d'inscription
samedi 4 janvier 2003
Dernière intervention
19 mai 2015
- 6 mai 2015 à 21:09
Bonjour,
J'ai besoin d'aide pour l'utilisation d'une requête SQL LIMIT avec OFFSET je n'obtient jamais le résultat dont j'ai besoin.

En français:
- Requête 1: Je prends les données d'une actus par l'id reçu avec la méthode GET par l'URL.
- Requête 2: J'affiche l'id précédent de la base de données.
Exemple si id URL = 12 et que l'id inférieur présent est 10. Je veux afficher ce 10.
- Requête 3: J'affiche l'id suivant de la base de données.
Exemple si id URL = 12 et que l'id supérieur présent est 15. Je veux afficher ce 15.

Je n'arrive pas à utiliser les LIMIT avec OFFSET correctement même en utilisant un ORDER BY.

Il me faut quelque chose comme:
ORDER BY id ASC LIMIT 1 OFFSET idurl;
et
ORDERBY id DESC LIMIT 1 OFFSET idurl;
Mais cela ne donne pas le résultat escompté.

Le codage:


$dbid=$_GET['id'];
//INITIALISATION $DBIDPREMIER
$sqlactus6 = "SELECT * FROM xactus WHERE id='".$dbid."'";
$reqactus6 = mysql_query($sqlactus6) or die('Erreur SQL !<br>'.$sqlactus6.'<br>'.mysql_error());
while($data = mysql_fetch_assoc($reqactus6))
{
$dbidpremier=$data['id'];
echo $dbidpremier;
}


$sqlactus3 = "SELECT * FROM xactus WHERE id='".$_GET['id']."'";
$reqactus3 = mysql_query($sqlactus3) or die('Erreur SQL !<br>'.$sqlactus3.'<br>'.mysql_error());
while($data = mysql_fetch_assoc($reqactus3))
{
$dbid=$data['id'];
$dbclassement=$data['classement'];
$dbdatedujour=$data['datedujour'];
$dbtitre=$data['titre'];
$dbarticle=$data['article'];
$dbcategorie=$data['categorie'];
$dblinkimage=$data['linkimage'];
echo $dbidpremier;
//AFFICHER

//CHECK IMAGE
if($dblinkimage==""){
echo "".$dbdatedujour."<br>";
echo "".$dbcategorie."<br>";
echo "".$dbtitre."<br>";
echo "".$dbarticle."<br>";
}else{//SINON
echo "".$dbdatedujour."<br>";
echo "".$dbcategorie."<br>";
echo "".$dbtitre."<br>";
echo "".$dblinkimage."<br>";
echo "".$dbarticle."<br>";

}
}
}
//PRECEDENT
$sqlactus4 = "SELECT * FROM xactus ORDER BY id ASC LIMIT ".$dbidpremier."";
$reqactus4 = mysql_query($sqlactus4) or die('Erreur SQL !<br>'.$sqlactus4.'<br>'.mysql_error());
while($data = mysql_fetch_assoc($reqactus4))
{
$dbid=$data['id'];

echo "while 4";
$dblinkimage=$data['linkimage'];
if($dblinkimage==""){
echo "<a href=\"actus.php&id=".$dbid."\">Précédent</a>";
}else{//SINON
echo "<a href=\"actusimg.php&id=".$dbid."\">Précédent</a>";
}
}
//SUIVANT
$sqlactus5 = "SELECT * FROM xactus ORDER BY id DESC LIMIT ".$dbidpremier."";
$reqactus5 = mysql_query($sqlactus5) or die('Erreur SQL !<br>'.$sqlactus5.'<br>'.mysql_error());
while($data = mysql_fetch_assoc($reqactus5))
{
$dbid=$data['id'];
echo "while 5";
$dblinkimage=$data['linkimage'];
if($dblinkimage==""){
echo "<a href=\"actus.php&id=".$dbid."\">Suivant</a>";
}else{//SINON
echo "<a href=\"actusimg.php&id=".$dbid."\">Suivant</a>";
}

}



?>


Merci par avance pour votre aide.
--
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
14319
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 décembre 2018
1
Merci
Il te faut 3 requêtes en effet :
- Une avec l'id exacte (pas besoin de LIMIT
- Pour la ligne d'avant, requête SQL en filtrant les entrées dont l'ID est inférieur à celui demande (12 dans ton cas) en tirant par ordre descendant et en ne prenant que le premier item.
- Pour la ligne d'après, similaire à la précédente, mais tout les ID supérieur à celui demandé et trier par ordre croissant.

la valeur passé au LIMIT est toujours une constante dans les 2 cas (pas de variable).

Merci NHenry 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de NHenry
Messages postés
143
Date d'inscription
samedi 4 janvier 2003
Dernière intervention
19 mai 2015
0
Merci
Bonjour,
Je n'avais pas pensé au filtre.
Car j'arrive aux résultats mais il passe 20 fois dans la boucle, donc 20 résultats au lieu d'un.
Et pour le filtre auriez-vous une idée ?



$i=1;
while($1<3){
requeteavant
$i++;
requeteaprès
$i++;
}


Est-ce comme ça que je dois faire ?

--
Commenter la réponse de cs_SkyCrasher
Messages postés
143
Date d'inscription
samedi 4 janvier 2003
Dernière intervention
19 mai 2015
0
Merci
Aie d'accord il faut le filtre dans la requête avec le while.
Merci, j'espère y arriver cette fois.


--
Commenter la réponse de cs_SkyCrasher
Messages postés
143
Date d'inscription
samedi 4 janvier 2003
Dernière intervention
19 mai 2015
0
Merci
Il me faut encore un peu d'aide pour la LIMIT.
C'est:
LIMIT 1, $dbidurl;
ou
LIMIT $dburl, 1;
ou
LIMIT 1 OFFSET $dburl,
ou
LIMIT $dburl OFFSET 1;
???
--
NHenry
Messages postés
14319
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 décembre 2018
-
Il ne faut pas que l'Id de l'item aille dans la clause LIMIT, c'est la clause WHERE quii fait le filtrage et ORDER BY qui met l'item en avant.
Pour la syntaxe, ça se trouve rapidement sur un moteur de recherche.
Commenter la réponse de cs_SkyCrasher
Messages postés
143
Date d'inscription
samedi 4 janvier 2003
Dernière intervention
19 mai 2015
0
Merci
J'ai compris.
ORDER BY ASC LIMIT $dbidurl;
Premier élément j'affiche sinon j'affiche rien
ou
ORDER BY DESC LIMIT $dbidurl;
Premier élément j'affiche sinon j'affiche rien
Merci

--
Commenter la réponse de cs_SkyCrasher

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.