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 :

[SQL] Requete sur deux tables


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 55
    Points : 40
    Points
    40
    Par défaut [SQL] Requete sur deux tables
    Bonjour,

    Commençons par le commencement:
    J'ai une table "convention" qui à un id ("id_conv") et simplifions en disant un nom et une année.
    J'ai une table "echeance" qui à un id ("id_echeance") et simplifions en disant un type, un état et un "id_conv" (clé étrangère).

    En fait une convention à plusieurs échéance, ces échéances ont un état à 0 si elle n'a pas encore était traité et 1,2,3 ou 4 dans le cas contraire.

    Je voudrais afficher le convention par id descendant avec les champs respectifs, ainsi que la dernière échéance qui a été traité et la prochaine à venir (tous deux respective a la convention)

    Sous forme d'un tableau ca donnerait cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Conv1 | Nom1 | Annee1 | TypeDerniereEcheance1 | TypeProchaineEcheance1
    Conv2 | Nom2 | Annee2 | TypeDerniereEcheance2 | TypeProchaineEcheance2
    Conv3 | Nom3 | Annee3 | TypeDerniereEcheance3 | TypeProchaineEcheance3
    ....
    Pour le moment tout ce que j'ai trouvé c'est:
    SQL:
    -Récupérer toutes les conventions avec un SELECT...FROM...ORDER BY
    -Récupérer toutes les échéances avec un SELECT...FROM...
    PHP:
    Faire des boucles à foison pour à chaque fois chercher les échéances correspondant à un id_conv, puis chercher la dernière traité et la suivante à venir....

    Ce que je voudrais et je sens que c'est possible c'est faire une seule requête qui me sortirai toutes les conventions avec leur nom, et année ainsi que l'échéance dernièrement traitée et la prochaine à venir.

    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 53
    Points
    53
    Par défaut
    Peut-être quelque chose un peu comme ça ?!?

    Evidemment ça dépend de ce que tu entends par la dernière échéance (etat<>0 ?) et la prochaine à venir (etat=0 ?). Tu ne le précisais pas trop...

    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
     
    SELECT
    	convention.id_conv,
    	convention.nom,
    	convention.annee,
    	t1.type,
    	t2.type
    FROM
    	convention
    LEFT JOIN
    	(SELECT id_conv,type FROM echeance WHERE etat<>0) AS t1 ON t1.id_conv=conv.id_conv) AS t1
    LEFT JOIN
    	(SELECT id_conv,type FROM echeance WHERE etat=0) AS t2 ON t2.id_conv=conv.id_conv) AS t2
     
    ORDER BY
    	convention.id_conv ASC

  3. #3
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    C'est vrai qu'il manque le critère qui détermine quelle est la prochaine ou la précédente échéance. Une colone de date peut-être ?

    Sinon plutôt que de faire ceci :
    Pour le moment tout ce que j'ai trouvé c'est:
    SQL:
    -Récupérer toutes les conventions avec un SELECT...FROM...ORDER BY
    -Récupérer toutes les échéances avec un SELECT...FROM...
    PHP:
    Faire des boucles à foison pour à chaque fois chercher les échéances correspondant à un id_conv, puis chercher la dernière traité et la suivante à venir....
    Tu peux déjà en une seule requête récupérer les conventions et leurs échéances :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT c.id_conv, c.nom_conv, c.annee_conv, 
      e.id_echeance, e.type, e.etat
    FROM convention AS c
    INNER JOIN echeance AS e ON c.id_conv = e.id_conv
    ORDER BY c.id_conv DESC, e.id_echeance DESC
    Ensuite en jouant avec le résultat de cette requête et des variables, tu peux obtenir ton tableau en PHP sans trop de difficulté.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 55
    Points : 40
    Points
    40
    Par défaut
    Merci pour cette rapidité!

    @all: en fait un convention est pour plusieurs mois, mais dans celle-ci il peut avoir jusqu'à 6 échéance (de paiement). Ces échéances sont à 0 si elle n'ont pas encore à être traité et de 1 à 4 dans les diverses étapes du traitement! (4 étant échéance traité).

    Ce que je souhaite est donc d'avoir la dernière échéance qui est passé dans un autre état que 0 et celle qui sera à venir.

    @mrcmrc: Je ne parvins pas à exécuter la requête malgré ma correction de parenthèse et bien sur le remplacement par les mon champs...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT
        convention.id_convention,
        convention.debut,
        convention.fin,
        t1.type,
        t2.type
    FROM
        convention
    LEFT JOIN
       (SELECT convention,type FROM echeance WHERE etat<>0) AS t1 ON (t1.convention=conv.id_convention) AS t1
    LEFT JOIN
        (SELECT convention,type FROM echeance WHERE etat=0) AS t2 ON (t2.convention=conv.id_convention) AS t2	
    ORDER BY
        convention.id_convention ASC
    @CinePhil: Ta requête est vraiment trés bien (et me rafraîchi la mémoire), en effet il reste juste à avoir pour une convention, ça dernière échéance et la prochaine

    Merci

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 53
    Points
    53
    Par défaut
    Ok, j'étais allé un peu vite... Ce n'est pas une histoire de parenthèses mais de nom de champ...

    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 convention.id_convention, convention.debut, convention.fin, t1.type, t2.type
    FROM convention
    LEFT JOIN (
     
    SELECT id_convention,
    TYPE FROM echeance
    WHERE etat <>0
    ) AS t1 ON t1.id_convention = convention.id_convention
    LEFT JOIN (
     
    SELECT id_convention,
    TYPE FROM echeance
    WHERE etat =0
    ) AS t2 ON t2.id_convention = convention.id_convention
    ORDER BY convention.id_convention ASC
    De manière générale, quand "ça marche pas", mieux vaut donner le message d'erreur renvoyé par MySQL, ça peut aider...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 55
    Points : 40
    Points
    40
    Par défaut
    Merci mrcmrc,

    La requête fonctionne mais j'obtiens NULL à mon type... Alors qu'il ne le sont pas.

    Sinon j'obtiens la même chose que CinePhil.

    Est t'il possible d'avoir en résultat deux id de convention pour une même ligne?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 53
    Points
    53
    Par défaut
    Tu peux quand même avoir un type=NULL si la jointure n'a rien donné (ie: pour cet id_convention il n'y a pas de t1.type <> 0 et/ou il n'y a pas de t2.type=0). Dans ce cas tous les champs de t1 (t2) sont NULL.

    -------------------

    Non, il n'y aura jamais deux id_convention pour la même ligne, puisque justement on a fait la jointure sur id_convention. Pour le vérifier, tu peux ajouter t1.id_convention et t2.id_convention dans ton SELECT, et tu verras que la valeur est toujours égale à convention.id_convention.

Discussions similaires

  1. [MySQL] Requetes SQL UPDATE sur deux table.
    Par makamine dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 20/05/2011, 00h52
  2. [SQL] requete sur deux tables
    Par yaka2 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 16/11/2006, 17h06
  3. SQL Query sur deux tables différentes.
    Par kabal22 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 25/12/2005, 17h52
  4. Requete sur deux tables
    Par ReaseT dans le forum ASP
    Réponses: 13
    Dernier message: 07/02/2005, 16h18
  5. [MS-SQL]requete sur 3 tables
    Par pascalT dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 30/04/2003, 11h24

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