Bonjour,
J'aimerais savoir s'il vous plait quelle requête peut-on écrire pour sélectionner l'avant dernier élément enregistrer dans une table.
Merci.
Version imprimable
Bonjour,
J'aimerais savoir s'il vous plait quelle requête peut-on écrire pour sélectionner l'avant dernier élément enregistrer dans une table.
Merci.
Bonjour Papidjo1456,
De mon point de vue, tout dépend du moteur de base de données que vous utilisez.
Pouvez-vous en dire plus à ce sujet ?
Ca dépend aussi et surtout de la présence d'une colonne d'horodatage, sans laquelle ce n'est pas possible (sauf utilisation de tables temporelles, mais c'est spécifique je crois à SQL Server 2016)
Re-bonjour,
J'utilise mysql pour mes requêtes et j'ai une table dans ma base de données avec un champ id (clé primaire) pour lequel je souhaiterais récupérer l'avant dernier enregistrement.
J'ai vu cette astuce sur un site web que j'ai testé mais ça n'a pas fonctionné. Je pense bien que j'ai mal structuré le code en utilisant l'astuce.
ORDER BY id (ASC) LIMIT (0,)1 : donne la première (avec l'id le moins élevé)
ORDER BY id DESC LIMIT (0,)1 : donne la dernière (avec l'id le plus élevé)
ORDER BY id (ASC) LIMIT 1,1 : donne la deuxième avec l'id le moins élevé
ORDER BY id DESC LIMIT 1,1 : donne l'avant dernière (la 2^e avec l'id le plus élevé)
ORDER BY id (ASC) LIMIT 2,1 : donne la troisième avec l'id le moins élevé
ORDER BY id DESC LIMIT 2,1 : donne l'antépénultième (la 3^e avec l'id le plus élevé)
Merci.
Comme l'a dit Escartefigue, il faut que la table possède une colonne permettant d'identifier de manière certaine l'ordre de création des lignes.
Après pour l'identifier, c'est relativement simple :
C'est celui pour lequel il n'y a pas plus d'une ligne dont l'identifiant ordonné est supérieur à celui-ci et inférieur au dernier ;)
Bonsoir,
Si l'id est un identifiant attribué par le SGBD, il ne faut en aucun cas l'utiliser pour connaitre l'ordre d'insertion
C'est tentant, je le reconnais, car la technique semble fonctionner quand la table est récente et qu'il y a eu peu d'insertions, mais...
... mais les id sont distribués par paquets aux différentes applications qui ont besoin d'insérer, or rien ne garantit que l'identifiant 1020 par exemple, soit commité par la transaction qui a recu cette valeur par le SGBD, avant l'identifiant 1028 pourtant de valeur supérieure.
Il peut y avoir d'autres causes de rangement différents des id par rapport au chronos en fonctions du SGBD et du paramétrage de l'identifiant (+ ou - riche selon les SGBD)
C'est pourquoi seule une colonne de type timestamp, voire même un timestamp + un chrono (un timestamp n'étant pas une garantie de valeur unique), permet de connaitre la chronologie d'insertion
Encore une fois, sauf avec les tables temporelles, mais qui n'existent pas pour tous les SGBD, loin s'en faut.
Salut,
Merci de m'avoir guidé, j'ai trouvé la solution à mon problème avec la requête suivante:
Merci.Code:$reqcandt = $bdd->query("SELECT * FROM ma_table ORDER BY id DESC LIMIT 1,1 ");
Encore une fois, si l'id est attribué par le SGBD, par exemple colonne de type auto-incrément, cette requête ne vous garantit en rien un résultat fiable !
Et en plus elle retourne le plus grand id, pas l'avant-dernier
Bonjour,
j'utilise un champ timestamp dans la base de données créé avec la fonction php date(''U'') qui me donne une valeur numérique. Comment puis-je l'utiliser pour afficher mes élément dans l'ordre chronologique?
En fait ma table contient des articles (image, titre, contenu, date, timestamp) et les contenus doivent être affichés sur la page web sur différents blocs distincts mais par ordre d'arrivé c'est-à-dire que le dernier article se met en vedette et les autres changent de bloc au fure et à mesure.
Merci de m'apporter votre aide.
Voici un exemple de requete pour récupérer le plus récent (MaCol3 étant la colonne d'horodatage)
Code:
1
2
3
4
5
6
7
8
9
10
11 SELECT MaCol1 , MaCol2 , MaCol3 FROM MaTable MAIN WHERE NOT EXISTS (SELECT 1 FROM MaTable SUBQ WHERE SUBQ.MaCol1=MAIN.MaCol1 AND SUBQ.MaCol2=MAIN.MaCol2 AND SUBQ.MaCol3>MAIN.MaCol3) ORDER BY MaCol1, MaCol2
Et un exemple pour récupérer le plus récent -1
La solution pour trouver l'avant dernier est un peu compliquée, MySQL oblige, avec un autre SGBD, une fonction de fenêtrage eut été beaucoup plus simple ;)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 SELECT Col1, Col2, Col3 FROM ( SELECT MaCol1 AS Col1 , MaCol2 AS Col2 , MAX(MaCol3) AS Col3 FROM MaTable MAIN WHERE MaCol3 < (SELECT MAX(MaCol3) FROM MaTable SUBQ WHERE SUBQ.MaCol1=MAIN.MaCol1 AND SUBQ.MaCol2=MAIN.MaCol2 AND SUBQ.MaCol3>MAIN.MaCol3) GROUP BY MaCol1, MACol2 ) ORDER BY Col1, Col2