SQL LIMIT OFFSET

Résolu
cs_SkyCrasher Messages postés 143 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 19 mai 2015 - 6 mai 2015 à 20:05
cs_SkyCrasher Messages postés 143 Date d'inscription samedi 4 janvier 2003 Statut Membre 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.
--
A voir également:

5 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
6 mai 2015 à 20:23
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).
1
cs_SkyCrasher Messages postés 143 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 19 mai 2015
6 mai 2015 à 20:44
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 ?

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


--
0
cs_SkyCrasher Messages postés 143 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 19 mai 2015
6 mai 2015 à 20:55
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;
???
--
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_SkyCrasher Messages postés 143 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 19 mai 2015
6 mai 2015 à 21:09
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

--
0
Rejoignez-nous