Forum Clubic

Requète sql

Bonjour,

Je voudrais insérer un système de requète SQL pour récupérer les articles rentrés dans la base de données avec une incrémentation automatique, et en fait je voudrais garder les 10 derniers par exemples. Ca serait une requète du genre :
SELECT Max(ID) FROM Table;
SELECT Max-1(ID) FROM Table;
SELECT Max-2(ID) FROM Table;
etc…
Et je voudrais savoir s’il existe une traduction correcte en SQL pour symboliser à chaque fois ce -1,-2,-3 etc… ?
Edité le 24/09/2008 à 17:58

Peux tu mettre un titre de sujet plus explicite et à défaut (si le changement de titre déconne, ce que je subodore) me le fournir?

Pour ton problème, si c’est du mySQL ou pgSQL (cf. www.postgresql.org…)

select ID
form Table
order by ID desc -- ou par la date, si ce sont des news, faut juste trier à l'envers pour avoir les derniers enregistrements
limit 10 offset 0

Pour Oracle :

select ID
form Table
where rownum <= 10 -- à voir, je ne sais pas si rownum commence à 0 ou à 1, ici j'ai supposé que ça commence à 1
order by ID desc -- ou par la date, si ce sont des news, faut juste trier à l'envers pour avoir les derniers enregistrements

Et pour les autres SGBD : troels.arvin.dk…

Ensuite si tu veux les résultats triés dans l’ordre de date ascendante, deux choix : soit un micmac PHP/Java/Etc (un tableau dans lequel tu stockes ça à l’envers, ce qui est assez simple, vu que tu sais que tu as au plus N éléments), soit une sous requête :

select A.* from (select ID
form Table
order by ID desc -- ou par la date, si ce sont des news, faut juste trier à l'envers pour avoir les derniers enregistrements
limit 10 offset 0) A order by A.ID asc

Je viens d’essayer sous MySQL il m’affiche ceci :

Erreur 
requête SQL: 

SELECT `id` , 'date', 'lien'
FROM 'table'
ORDER BY 'id' DESC 
LIMIT 10 
OFFSET 0 
MySQL a répondu: 

#1064 - Erreur de syntaxe pr?de ''table'
order by 'id' desc
limit 10 offset 0' ?a ligne 2  

Mais est ce qu’avec cette technique, je pourrais dissocier chaque ligne de ma base ou cela va me donner un bloc d’informations non dissociables? (c-a-d, est que je vais pouvoir traiter le dernier id et l’avant dernier différemment ?)
Car au final, j’aimerais arriver à faire une présentation acceptable
Edité le 21/09/2008 à 02:06

Lis ça :

dev.mysql.com…

Ensuite ton erreur c’est dans l’utilisation de ces foutus quotes : mySQL est con comme ses pieds donc

  1. ne pas utiliser ` pour délimiter les noms de champs (je parle bien du caractère “accent aigu/grave” que tu peux faire en faisant Alt Gr + 7. En principe, en mode SQL ANSI, c’est " qu’il faut utiliser mais sous mySQL ça crée une chaine de caractères. Tss :confused:
  2. ne pas utiliser des single quote pour délimiter les noms de champs : ça crée une chaine de caractères!

Donc :

SELECT id , date, lien
FROM table
ORDER BY id DESC 
LIMIT 10 
OFFSET 0 

Et ce qui m’énerve le plus c’est que c’est ce foutu phpmyadmin qui ajoute ces ` :confused:

C’est bon je viens d’y arriver avec ce code :

requête SQL: 
SELECT * 
FROM `table` 
ORDER BY `id` DESC 
LIMIT 1 , 10

Je te remercie beaucoup.

Par contre j’ai une question qui reste en suspens depuis le dernier message : est ce qu’avec cette requète, je vais pouvoir faire une présentation via “fecht away” en ayant :
date1 lien1
date2 lien2
date3 lien3
etc…

Donc tu les veux dans l’ordre de date ascendant.

C’est ce que je disais dans mon deuxième point : puisque tu sembles être en PHP (mais en Java l’exemple est le même, exceptions faites de la syntaxe) tu peux faire ça :

$ta = array();
for ($i = 10; $a = mysql_fetch_XXX($q); --$i) {
$ta[$i] = $a;
}

Et parcourir ce tableau dans l’ordre inverse.

Sinon tu peux le faire via une requête:

select * from (SELECT * 
FROM table
ORDER BY id DESC 
LIMIT 10 offset 1) order by id asc

Sinon vire ces foutus backtick spécifiques à mySQL, et utilise LIMIT count OFFSET offset qui est fonctionnel sur pgSQL et mySQL (donc mieux car ça touche une gamme plus large, même si limitée, de SGBD)

En fait ce que j’ai, ce sont 3 champs id (autoinc), date et lien et je voudrais afficher la liste des dix dernières news (afficher seulement date et lien) en prenant le id en decroissant (ce qu’on a réussi a faire).

et maintenant en fait, j’aimerais pouvoir l’afficher sous forme de liste ou tableau, tu vois ?

et je n’arrive pas tro à comprendre ton code, est ce que tu pourrais m’expliquer tes variables : $ta, $i, $a, XXX stp
Edité le 21/09/2008 à 16:18

Je vois.

Tu as déjà fait du PHP? Java? Et en fait, tu utilises quel langage pour afficher tes pages web à partir de ta base de données?

Oui j’ai un an de HTML, PHP, SQL etc et la chui en BTS Développement d’application mais j’arrive pas à voir comment tu as formé ton code php.

Regarde j’ai essayé avec ça mais apparemment ca marche pas :

//récupère dans le curseur $requete les pièces en fonction du type choisi dans le formulaire précédent
$requete="SELECT `date` , `lien` FROM `table` ORDER BY `id` DESC LIMIT 10 OFFSET 0 "; 

$resultat=mysql_query($requete)
		or die("Execution de la requete impossible");
		
//Affichage du formulaire
echo"News :";

echo"<table cellpadding='5' border='1' align='center'/>";
while($ligne=mysql_fetch_array($resultat))
{		extract($ligne);
		echo"<tr><td valign='top' width='15%'>\n";
		echo"<b> $date </b>
			</td>
			<td>$lien</td>
			</tr>";
}
echo"</table>";

T’as une idée ?

Comme ça :

$lines =array();
for ( $i = 10; $ligne=mysql_fetch_array($resultat); --$i) {		
  $lines[$i] = $ligne;
}
if ($lines) for ( ; $i <= 10; ++$i) {
		extract($lines[$i]);
		echo"<tr><td valign='top' width='15%'>\n";
		echo"<b> $date </b>
			</td>
			<td>$lien</td>
			</tr>";
}

Je te laisse corriger les erreurs potentielles, mais saches que c’est l’idée.

Je suis désolé j’ai encore un petit problème, je pense que ça doit une erreur de code un moment dans ma page de test mais voila ce qu’il m’affiche au final (les données sont bidon c’est juste une page de test) :

News :
Notice: Undefined offset: 0 on line 28

Warning: extract(): First argument should be an array on line 28

Notice: Undefined variable: date on line 30

Notice: Undefined variable: lien in on line 32
2024-09-08 00:00:00 www.clubic.fr 2025-09-08 00:00:00 www.clubic.fr 2026-09-08 00:00:00 www.clubic.fr 2027-09-08 00:00:00 www.clubic.fr 2028-09-08 00:00:00 www.clubic.fr 2029-09-08 00:00:00 www.clubic.fr 2030-09-09 00:00:00 www.clubic.fr 2031-09-08 00:00:00 www.clubic.fr 2001-10-08 00:00:00 www.clubic.fr 2002-10-08 00:00:00 www.clubic.fr 

Essaye de mettre ça après le if ($lines) (dans un bloc, ie { … })

if ($i < 0) $i = 0;

Sinon ben ksort() + foreach.

Juste une question, ne faut il pas que tu ‘déclare’ $lien et $ date par :
$date = $ligne[‘date’];
$lien = $ligne[‘lien’];

et je pense que pour ta requête


$requete="SELECT `date` , `lien` FROM `table` ORDER BY `id` DESC LIMIT 10 OFFSET 0 "; 

tu devrais faire offset 1 comme te l’avais mis Sans-Nom.
Undefined offset: 0 on line 28 => Un tableau contient un index valant 0 qui n’existe pas.
et ça t’emène aussila deuxième erreur


Warning: extract(): First argument should be an array on line 28

le ligne 0 n’existant pas, tu peux pas faire extract!!!

(Après, c’est ce que j’ai pu comprendre!!!)
Edité le 22/09/2008 à 10:28

En fait Sans-Nom (désolé, je pose beaucoup de question mais j’ai pas des énormes connaissances en PHP si ce n’est les commandes basiques…ca viendra ^^) tu me dis de remplacer cette ligne :


if ($lines) for ( ; $i <= 10; ++$i) {
extract($lines[$i]);

Par celle la :


if ($lines) for ( ; $i <= 10; ++$i) {
if ($i < 0) $i = 0;
extract($lines[$i]);

En gros oui. Mais avant le for.

if ($lines) { for ( $i = $i < 0 ? 0:$i; $i <= 10; ++$i) {

C’est crade, mais j’ai pas envie de me faire chier:)

YEAH lol je crois que ça a marché mais une seule dernière petite erreur dont je ne comprend pas l’existence d’ailleurs :

echo"News :";

$lines = array();
for ( $i = 10; $ligne=mysql_fetch_array($resultat); --$i) {		
 $lines[$i] = $ligne;
}
$date = $ligne['date'];
$lien = $ligne['lien'];
if ($lines) { for ( $i = $i < 0 ? 0:$i; $i <= 10; ++$i) {
		extract($lines[$i]);
		echo"<tr><td valign='top' width='15%'>\n";
		echo"<b>$date</b>
			</td>
			<td>$lien</td>
			</tr>";
}
?>
</body>

</html>
Parse error: parse error on line 39

La ligne 39, c’est la où il y a marqué :confused:
Edité le 22/09/2008 à 22:51

if ($lines) { for ( $i = $i < 0 ? 0:$i; $i <= 10; ++$i) {
		extract($lines[$i]);
		echo"<tr><td valign='top' width='15%'>\n";
		echo"<b>$date</b>
			</td>
			<td>$lien</td>
			</tr>";
}

Tu ouvres deux accolades et tu n’en fermes qu’une…

Merci beaucoup d’avoir repérer mais en fait je crois que je suis vraiment nul, voila ce qu’il m’affiche :

News :
Notice: Undefined offset: 0 on line 30

Warning: extract(): First argument should be an array on line 30
2023-09-08 00:00:00 [clubic.free.fr...](http://clubic.free.fr) 2024-09-08 00:00:00 www.clubic.fr 2025-09-08 00:00:00 www.clubic.fr 2026-09-08 00:00:00 www.clubic.fr 2027-09-08 00:00:00 www.clubic.fr 2028-09-08 00:00:00 www.clubic.fr 2029-09-08 00:00:00 www.clubic.fr 2030-09-09 00:00:00 www.clubic.fr 2031-09-08 00:00:00 www.clubic.fr 2001-10-08 00:00:00 www.clubic.fr 

avec ce code :

<html>
<head>
<title>Essai affichage</title>
</head>
<body>

<?

$maconnexion =mysql_connect("localhost","root","geronimo")
	or die("Connexion au serveur impossible");
$db=mysql_select_db("essai",$maconnexion)
	or die("Sélection de la base de données impossible");
	
//récupère dans le curseur $requete les pièces en fonction du type choisi dans le formulaire précédent
$requete="SELECT `date`,`lien` FROM `table` ORDER BY `id` DESC LIMIT 10 OFFSET 1"; 

$resultat=mysql_query($requete)
		or die("Execution de la requete impossible");
		
//Affichage du formulaire
echo"News :";

$lines = array();
for ( $i = 10; $ligne=mysql_fetch_array($resultat); --$i) {		
 $lines[$i] = $ligne;
}
$date = $ligne['date'];
$lien = $ligne['lien'];
if ($lines) { for ( $i = $i < 0 ? 0:$i; $i <= 10; ++$i) {
		extract($lines[$i]);
		echo"<tr><td valign='top' width='15%'>\n";
		echo"<b>$date</b>
			</td>
			<td>$lien</td>
			</tr>";
}}
?>
</body>

</html>

Et j’ai aussi remarqué que si je met OFFSET 1 dans la requète SQL il ne m’affiche pas la dernière donnée crée alors qu’avec OFFSET 0 oui.

Je ne comprends plus rien :frowning:
Edité le 22/09/2008 à 23:23

c’est LIMIT nombre_de_result OFFSET index_commençant_zéro

Et pour mon code, ton extract foire, c’est tout. Faudrait faire un var_dump($lines).

Voila le résultat :

News :array(10) { [10]=> array(4) { [0]=> string(19) "2002-10-08 00:00:00" ["date"]=> string(19) "2002-10-08 00:00:00" [1]=> string(14) "www.clubic.com" ["lien"]=> string(14) "www.clubic.com" } [9]=> array(4) { [0]=> string(19) "2001-10-08 00:00:00" ["date"]=> string(19) "2001-10-08 00:00:00" [1]=> string(14) "www.clubic.com" ["lien"]=> string(14) "www.clubic.com" } [8]=> array(4) { [0]=> string(19) "2031-09-08 00:00:00" ["date"]=> string(19) "2031-09-08 00:00:00" [1]=> string(14) "www.clubic.com" ["lien"]=> string(14) "www.clubic.com" } [7]=> array(4) { [0]=> string(19) "2030-09-09 00:00:00" ["date"]=> string(19) "2030-09-09 00:00:00" [1]=> string(14) "www.clubic.com" ["lien"]=> string(14) "www.clubic.com" } [6]=> array(4) { [0]=> string(19) "2029-09-08 00:00:00" ["date"]=> string(19) "2029-09-08 00:00:00" [1]=> string(14) "www.clubic.com" ["lien"]=> string(14) "www.clubic.com" } [5]=> array(4) { [0]=> string(19) "2028-09-08 00:00:00" ["date"]=> string(19) "2028-09-08 00:00:00" [1]=> string(14) "www.clubic.com" ["lien"]=> string(14) "www.clubic.com" } [4]=> array(4) { [0]=> string(19) "2027-09-08 00:00:00" ["date"]=> string(19) "2027-09-08 00:00:00" [1]=> string(14) "www.clubic.com" ["lien"]=> string(14) "www.clubic.com" } [3]=> array(4) { [0]=> string(19) "2026-09-08 00:00:00" ["date"]=> string(19) "2026-09-08 00:00:00" [1]=> string(14) "www.clubic.com" ["lien"]=> string(14) "www.clubic.com" } [2]=> array(4) { [0]=> string(19) "2025-09-08 00:00:00" ["date"]=> string(19) "2025-09-08 00:00:00" [1]=> string(14) "www.clubic.com" ["lien"]=> string(14) "www.clubic.com" } [1]=> array(4) { [0]=> string(19) "2024-09-08 00:00:00" ["date"]=> string(19) "2024-09-08 00:00:00" [1]=> string(14) "www.clubic.com" ["lien"]=> string(14) "www.clubic.com" } } array(10) { [10]=> array(4) { [0]=> string(19) "2002-10-08 00:00:00" ["date"]=> string(19) "2002-10-08 00:00:00" [1]=> string(14) "www.clubic.com" ["lien"]=> string(14) "www.clubic.com" } [9]=> array(4) { [0]=> string(19) "2001-10-08 00:00:00" ["date"]=> string(19) "2001-10-08 00:00:00" [1]=> string(14) "www.clubic.com" ["lien"]=> string(14) "www.clubic.com" } [8]=> array(4) { [0]=> string(19) "2031-09-08 00:00:00" ["date"]=> string(19) "2031-09-08 00:00:00" [1]=> string(14) "www.clubic.com" ["lien"]=> string(14) "www.clubic.com" } [7]=> array(4) { [0]=> string(19) "2030-09-09 00:00:00" ["date"]=> string(19) "2030-09-09 00:00:00" [1]=> string(14) "www.clubic.com" ["lien"]=> string(14) "www.clubic.com" } [6]=> array(4) { [0]=> string(19) "2029-09-08 00:00:00" ["date"]=> string(19) "2029-09-08 00:00:00" [1]=> string(14) "www.clubic.com" ["lien"]=> string(14) "www.clubic.com" } [5]=> array(4) { [0]=> string(19) "2028-09-08 00:00:00" ["date"]=> string(19) "2028-09-08 00:00:00" [1]=> string(14) "www.clubic.com" ["lien"]=> string(14) "www.clubic..............

En fait je crois qu’on est en train de se prendre la tête pour rien, parce que afficher le résultat dans un tableau je l’ai fait l’année dernière, ça avait pas l’air si compliqué que ça.Il y a vraiment pas un truc avec fetch_array ? parce que je sais qu’on utilisait ça l’année dernière et ça marchait bien, là je ne comprends plus…