{MySQL} select sur 2 tables >

audreyodd -  
 audreyodd -
Bonjour,
j'ai une requete à faire pour la gestion d'un back office. il y a une table ADHERENT (idADHERENT,nom,prenom...) et une table COTISATION (id,idADHERENT,annee,mode_paiement,paiement_effectue...) qui regroupe toutes les cotisations d'un adhérent. (une cotisation étant le paiement de l'abonnement au site pour un an) .
une page de recherche permet d'effectuer des recherches sur ces tables et notamment de faire ressortir :
--> la dernière année de cotisation des adhérents pour l'année : xxxx (année à renseigner lors de la recherche)
Adhérent A : cotisations 2007,2008,2009
Adhérent B : cotisations 2008,2009
Adhérent C : cotisations 2009,2010

si je veux les adhérent dont la dernière année de cotisation est 2009 avec la requete :

SELECT * FROM ADHERENT,COTISATIONS WHERE COTISATIONS.idADHERENT = ADHERENT.idADHERENT AND COTISATIONS.annee >= 2009

ca me sort : l'adhérent A,B, etttttt C or la est mon problème : le C ne doit pas apparaitre pour la requete de l'année 2009 mais pour une recherche sur l'année2010 car il s'agit de la dernière année de cotisation de l'adhéren C...

Merci pour vos suggestions ...

3 réponses

  1. fiu
     
    Pardon, j'ai lu un peu en diagonale

    tu pourrais faire
    SELECT *
    FROM ADHERENT,COTISATIONS
    WHERE COTISATIONS.idADHERENT = ADHERENT.idADHERENT
    AND (COTISATIONS.idADHERENT, COTISATIONS.annee) in (
      SELECT idADHERENT, max(annee)
      FROM COTISATIONS
      GROUP BY idADHERENT
      HAVING MAX(annee)=2009
    )

    qu'il faut comprendre comme
    A. le SELECT idADHERENT, max(annee) FROM COTISATIONS GROUP BY idADHERENT HAVING MAX(annee)=2009 est l'extraction des dernières années de cotisation par nom, dont on ne conserve que les lignes où max(annee) = 2009
    B. cette grille de données calculée en A sert de guide pour filtrer les lignes de ADHERENT x COTISATION
    2
  2. audreyodd
     
    c'est parfait, merciiiiii, j'aurais jamais pensé à utiliser un IN mais plutot de faire un select imbriqué, et puis je n'aurais également pas pensé à faire un having comme ca....manque d'expérience j'imagine! merci
    1
  3. fiu
     
    remplace ton >= par =
    0
    1. audreyodd
       
      meme avec le simple = il y aura aussi l'adhérent C qui sortira à la requete pour lannee 2009 parce qu'il a une ligne de la table COTISATION qui répond à la requete...tu vois?
      0