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 

Votre réponse

6 réponses

Meilleure réponse
NHenry 14271 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 14 octobre 2018 Dernière intervention - 6 mai 2015 à 20:23
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

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

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
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
cs_SkyCrasher 143 Messages postés samedi 4 janvier 2003Date d'inscription 19 mai 2015 Dernière intervention - 6 mai 2015 à 20:46
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
cs_SkyCrasher 143 Messages postés samedi 4 janvier 2003Date d'inscription 19 mai 2015 Dernière intervention - 6 mai 2015 à 20:55
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 14271 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 14 octobre 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
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.