OVH Community, votre nouvel espace communautaire.

MySql:requette donnant l'enregistrement actuel et suivant


smk1
29/03/2013, 18h03
Merci pour tes liens Cassiopee.
J'en avais trouvé 1, mais n'ayant pas compris grand chose,
j'esperais que l'on me donnerai une astuce moins compliquée.

Je vais donc devoir m'y pencher ce week end.

Si j'arrive a faire une fonction je vous ferais un retour.

cassiopee
29/03/2013, 14h10
@steve4712 : tu fais la même erreur de lecture que moi plus haut

steve4712
29/03/2013, 12h08
Si tu connais l'enregistrement en cours, il suffit de placer l'id dans une variable et de chercher le suivant par > ou le précédent par <

Code:
$id = {id de l'enreg en cours}
Select* from livres_entree_sortie WHERE id > $id LIMIT 1
Ca marche aussi pour une autre colonne :

Code:
$date = {date-sortie de l'enreg en cours}
Select * from livres_entree_sortie WHERE dthr_sortie > $date LIMIT 1

cassiopee
29/03/2013, 09h29
Ok je comprends mieux mon incompréhension : ce genre de fonctions n'existe pas
dans MySQL.

C'est un peu laborieux avec MySQL mais on y arrive :

http://explainextended.com/2009/03/1...alue-lead-lag/

http://www.onlamp.com/pub/a/mysql/20...ql.html?page=2

Avec un peu de chance, on doit pouvoir définir sa propre fonction LAG()

http://dev.mysql.com/doc/refman/5.5/...functions.html

smk1
29/03/2013, 05h30
La reponse de cassiopee indique que je me suis mal exprimé.
Mes recherches m'informent qu'en fait ce que je cherche est appelé
"fonctions analytiques".
LAG et LEAD
Ces 2 fonctions permettent d'obtenir la valeur pour une colonne donnée,
de l'enregistrement précédent et suivant.

Exemple (
Code:
Select livre, dthr_sortie,lag(dthr_sortie) as sortie_precedente from livres_entree_sortie
where livre="SQL POUR LES NULS"
and dthr_sortie>= "2013-01-03 10:00:00"
résultats
Code:
livre             | dthr_sortie         | sortie_precedente
SQL POUR LES NULS | 2013-01-03 10:00:00 | null
SQL POUR LES NULS | 2013-01-04 15:00:00 | 2013-01-03 10:00:00
SQL POUR LES NULS | 2013-01-11 09:00:00 | 2013-01-04 15:00:00
SQL POUR LES NULS | 2013-01-13 15:00:00 | 2013-01-11 09:00:00
SQL POUR LES NULS | 2013-01-23 12:00:00 | 2013-01-13 15:00:00
SQL POUR LES NULS | 2013-01-27 15:00:00 | 2013-01-23 12:00:00
Sur la meme ligne, on voit la date de sortie du livre, ainsi que la date précédente de sortie

LEs fonctions leag et lag n'existent pas en MySQl.
Peut on les simuler d'une autre facon ?

cassiopee
28/03/2013, 19h12
La façon de faire va dépendre du critère de recherche/tri des enregistrements.

Supposons que la table "utilisateurs" ait comme contenu :

Code:
id    | nom
--------------------
1     | Durand
2     | Baron
3     | Dupin
Si au départ on veut seulement récupérer "Baron", on peut écrire :

Code:
SELECT id,nom FROM utilisateurs WHERE (id='2')
Si on veut récupérer "Durand" et "Baron" :

Code:
SELECT id,nom FROM utilisateurs WHERE (id='1') or (id='2') ORDER BY id
Si on veut récupérer "Baron" et "Dupin" :

Code:
SELECT id,nom FROM utilisateurs WHERE (id='2') or (id='3') ORDER BY id
Si on veut récupérer les 3 noms :

SELECT id,nom FROM utilisateurs WHERE (id='1') or (id='2') or (id='3') ORDER BY id
Ensuite, il faut voir d'où viennent les chiffres dans la partie "WHERE" de la requête.

Si cette requête est mise au point dans un programme PHP par exemple,
on aura vraisemblablement la valeur de clé à rechercher dans une variable.

Par exemple une variable "$id" va la contenir.

Du coup on peut écrire en PHP :

$cmd = "SELECT id,nom FROM utilisateurs WHERE (id='".($id-1)."' or (id='".$id."') or (id='".($id+1)."') ORDER BY id";
Si la variable "$id" vaut 2, cela donnera comme requête :

SELECT id,nom FROM utilisateurs WHERE (id='1') or (id='2') or (id='3') ORDER BY id
Si la variable "$id" vaut 17, cela donnera comme requête :

SELECT id,nom FROM utilisateurs WHERE (id='16') or (id='17') or (id='18') ORDER BY id
etc.

Attention à un "détail" : cette façon de faire suppose qu'il n'y ait pas de "trou"
dans la colonne "id", autrement pas pas de "1,2,6,9,13" mais toujours "1,2,3,4,5,6" etc.

Autre subtilité : bien gérer les bornes, c'est-à-dire lorsque l'enregistrement courant
est le premier de la table ou le dernier de la table, il n'y aura pas d'enregistrement
précédent ou d'enregistrement suivant respectivement.

smk1
28/03/2013, 18h28
Bonjour

Je reformule ma question

J'ai besoin d'une requette capable de me donner
pour une colonne precise, la valeur
dans l'enregistrement actuel
dans l'enregistrement précédent et/ou suivant.

Exemple

Code :Sélectionner tout - Visualiser dans une fenêtre à part
Code:
select id,col1from table
where col1=prec.col1 or col1=suiv.col1
order by id
prec.col1 ====> Valeur de col1 dans l'enregistrement qui précédait l'enregistrement(la ligne) actuel.

suiv.col1 ====> Valeur de col1 dans l'enregistrement qui va suivre l'enregistrement actuel

Si cela n'est pas possible, quelle astuce me proposez vous pour arriver au meme resultas ?

Merci d'avance

smk1
07/12/2012, 02h59
Dans mon exemple id est une cle primaire autoincrementée.
Idealement si n'importe quel champ, meme non indexée pouvait etre utilisée, ce serait le top.

Desolé pour la reponse tardive.

cassiopee
05/12/2012, 18h18
ça dépend surtout de la clé de la table, quelle est-elle ?

smk1
05/12/2012, 17h15
Bonjour

Je cherche a faire une requette qui me donne
pour chaque enregistrement, certaines infos(champs) de l'enregistrement suivant
Est ce possible ?

La requette serait du style

Code:
select id, [id_suivant] from nom_table