IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Jointure sur un même table avec utilisation MIN/MAX


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 11
    Points
    11
    Par défaut Jointure sur un même table avec utilisation MIN/MAX
    Bonjour,

    Le titre n'étant pas très clair, je vais tenter de me rattraper sur les explications

    Voilà pour faire simple je vais considérablement reduire ma table (qui normalement contient une vingtaine de colonne).

    Supposons que ma table soit la suivant:

    barcode | version | date
    -----------------------------
    A | 1 | 13/12
    A | 2 | 14/12
    A | 3 | 14/12
    B | 2 | 10/12
    B | 3 | 10/12

    Ce type de table permet de gerer les évolutions successive d'une Termsheet (chaque évolution étant associée à un numero de version qui s'incrémente).
    Je cherche à recuperer SUR LA MÊME LIGNE, la date de la version minimale et de la version max pour l'ensemble des barcodes.

    A noter que la 1ère version n'est pas forcément la 1!

    Voici ce que j'ai pour le moment et qui fonctionne pour le barcode "A":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    select *	
    from `TERMSHEET_OFE_ASSOCIATION` ofe
     
    join `TERMSHEET_OFE_ASSOCIATION` ofe2
    on ofe.barcode=ofe2.barcode
    and ofe2.`version`=(
    		select MAX(`version`) 
    		from `TERMSHEET_OFE_ASSOCIATION`
    		where barcode ='A'
    )
    where ofe.barcode='A'
    group by ofe.barcode
    Cependant cette requête ne fonctionne que pour le barcode A et ne peut pas être utilisé par boucler sur tout les barcodes.

    J'ai essayé de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    and ofe2.`version`=(
    		select MAX(`version`) 
    		from `TERMSHEET_OFE_ASSOCIATION`
    		where barcode = ofe.barcode
    )
    Sans succès!

    Je suis un peu perdu pour le moment. D'autant plus que ma requête me parait déjà assez lourde!

    /* 0 rows affected, 1 rows found. Duration for 1 query: 0.031 sec. */
    Pour le barcode A!

    Merci d'avance pour votre aide.

    Cdlt,
    chips

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    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
    16
    17
    18
    19
    SELECT tmp.barcode,
    	tmp.version_mini,
    	t1.`date` AS date_mini,
    	tmp.version_maxi,
    	t2.`date` AS date_maxi
    FROM
    (
    	SELECT barcode,
    		MIN(version) AS version mini,
    		MAX(version) AS version maxi
    	FROM TERMSHEET_OFE_ASSOCIATION
    	GROUP BY barcode
    ) tmp
    INNER JOIN TERMSHEET_OFE_ASSOCIATION t1
    	ON t1.barcode = tmp.barcode
    	AND t1.`date` = tmp.version_mini
    INNER JOIN TERMSHEET_OFE_ASSOCIATION t2
    	ON t2.barcode = tmp.barcode
    	AND t2.`date` = tmp.version_maxi
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup ça marche.

    Je ne savais pas qu'on pouvais se servir d'un SELECT dans un FROM, en y réflechissant c'est logique.

    Une petite erreur par contre, c'est t1.version = tmp.version_mini. Et non pas date

    Merci encore,
    chips

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Une petite erreur par contre, c'est t1.version = tmp.version_mini. Et non pas date
    Exact !

    J'étais obnubilé par le mauvais choix du nom de colonne date qui est un mot réservé du langage SQL.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 11
    Points
    11
    Par défaut
    Oui officielement j'ai date_c, date_m, date_d. J'ai juste simplifié en laissant date! Par contre il y a bien version qui lui est un mot clé :/

    Mais bon je ne suis pas responsable de la gestion des colonnes de cette BDD je ne fais que les requêtes :p

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] SELECT * avec jointure sur une même table
    Par Oprichnik dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 09/03/2011, 13h17
  2. Requete avec jointure sur la même table
    Par CaptainChoc dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/04/2009, 12h30
  3. Réponses: 3
    Dernier message: 12/06/2007, 23h31
  4. [MySQL] requête avec jointure sur la même table
    Par gwena54 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 08/05/2007, 11h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo