SQL LIMIT OFFSET [Résolu]

cs_SkyCrasher 143 Messages postés samedi 4 janvier 2003Date d'inscription 19 mai 2015 Dernière intervention - 6 mai 2015 à 20:05 - Dernière réponse : cs_SkyCrasher 143 Messages postés samedi 4 janvier 2003Date d'inscription 19 mai 2015 Dernière intervention
- 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 

6 réponses

Répondre au sujet
NHenry 14134 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 23 avril 2018 Dernière intervention - 6 mai 2015 à 20:23
+1
Utile
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).
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de NHenry
cs_SkyCrasher 143 Messages postés samedi 4 janvier 2003Date d'inscription 19 mai 2015 Dernière intervention - 6 mai 2015 à 20:44
0
Utile
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
cs_SkyCrasher 143 Messages postés samedi 4 janvier 2003Date d'inscription 19 mai 2015 Dernière intervention - 6 mai 2015 à 20:46
0
Utile
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
cs_SkyCrasher 143 Messages postés samedi 4 janvier 2003Date d'inscription 19 mai 2015 Dernière intervention - 6 mai 2015 à 20:55
0
Utile
1
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 14134 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 23 avril 2018 Dernière intervention - 6 mai 2015 à 21:02
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
cs_SkyCrasher 143 Messages postés samedi 4 janvier 2003Date d'inscription 19 mai 2015 Dernière intervention - 6 mai 2015 à 21:09
0
Utile
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.