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,
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
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
Salut,
la colonne id est de type entier, je peux récupérer le dernier élément de la table avec le code suivant:
Mais comment dois-je procéder pour récupérer l'avant dernier?
Code : Sélectionner tout - Visualiser dans une fenêtre à part "SELECT * FROM ma_table ORDER BY ID DESC LIMIT 0,1
Merci.
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 : Sélectionner tout - Visualiser dans une fenêtre à part $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
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
* * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager