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 :

Requête avec plusieurs jointures


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 73
    Points : 100
    Points
    100
    Par défaut Requête avec plusieurs jointures
    Bonjour,

    J'ai beaucoup de mal à améliorer mes requêtes SQL avec des jointures, alors quand j'essaie d'en enchainer plusieurs cela devient n'importe quoi. Peut être que ce que j'essaie n'est pas terrible non plus, je m'en remets à votre aide.

    Le select de base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id 
    from table1 
    where install_etat=2
    Qui est sensé me renvoyer une dizaine de résultats.

    Avec ça je voulais la date la plus récente présente en base sur une autre table pour chacun de ces id.
    Mais là, je n'arrive pas à avoir les dernières dates. Avant, je faisais une boucle avec un mysql_fetch_assoc sur les différents id (1ere requete), et je n'avais pas de problème pour récupérer ensuite les données , ma requête dans la boucle ressemble à qqch comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT tmp.dr_date, t.production FROM table2 t 
    INNER JOIN ( 
    SELECT MAX( `date` ) AS dr_date 
    FROM table2 WHERE id =$id
    AND production !=0 	
    )tmp ON tmp.dr_date = t.`date` 
    WHERE id =$id
    AND production !=0

    Mais j'aimerais trouver le moyen de tout traiter dans ma requête, j'ai regardé pas mal de code avec plusieurs jointures mais je ne comprends pas toujours le comportement qu'elles ont.
    J'aurais besoin d'aller encore plus loin par la suite et ça s'annonce difficile pour moi!!

    Si quelqu'un se sent de me donner une indication, un tuto qui pourrait m'aider je suis preneur!!

    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    la structure de votre requête est un bon début.

    Maintenant vous n'avez plus qu'a comprendre ceci et vous aurez le résutlat voulu : http://sqlpro.developpez.com/cours/sqlaz/ensembles/

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 73
    Points : 100
    Points
    100
    Par défaut
    Merci pour ce lien!

    J'y travail, mais je ne dois pas encore avoir bien compris.
    Il arrive un moment ou je ne sais plus où mettre mes morceau de requête, j'ai beaucoup d'erreur du genre : "#1111 - Invalid use of group function", ou alors "Subquery returns more than 1 row" erreur avec laquelle je suis entièrement d'accord vu que c'est ce que je cherche à faire!!

    Ca va venir.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    oki,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT tmp.dr_date, t.production FROM table2 t 
    INNER JOIN ( 
    SELECT id, MAX( `date` ) AS dr_date 
    FROM table2 WHERE production !=0 	
    group by id
    ) tmp ON tmp.id = t.id and tmp.dr_date = t.`date` 
    WHERE production !=0

    Au passage, appeler une colonne Date est une mauvais idée c'est un mot clef réservé à SQL.

  5. #5
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Et en SQL, "différent de" s'écrit <>, pas != comme en PHP !
    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 !

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 73
    Points : 100
    Points
    100
    Par défaut
    Bonjour,

    Merci pour vos réponses.
    Il est vrai que comme le SGBD que j'utilise interprète le "!=" j'ai tendance à oublier l'autre syntaxe.

    Pour les colonnes "date" c'est surtout que je simplifie les noms de mes colonnes lorsque je poste des requêtes pour que ce soit plus compréhensible. Merci pour vos remarques.

    Cette requête (dernière postée par punkoff) fonctionne bien la majorité du temps, mais cette table me pose quelques problèmes car elle est sujette aux erreurs d'insertion.
    C'est pourquoi je cherchais à vérifier les différents id dans une table différente plus stable selon un paramètre d'installation.

    Est ce qu'il est possible d'utiliser une série de résultats d'une sélection sur une table comme paramètre dans la requête?

    Pour imager mes propos je poste une requête qui ne marche pas, mais qui montre le comportement que je cherche à obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT tmp.dr_date, t.production FROM tableA t 
    INNER JOIN ( 
    SELECT id, MAX( `date` ) AS dr_date 
    FROM tableA WHERE production !=0 
     
    //==== autre select ====//	
    and id=(select distinct id from tableB where install=2)
    //=================//
     
    GROUP BY id
    ) tmp ON tmp.id = t.id AND tmp.dr_date = t.`date` 
    WHERE production !=0
    Une sous requête ne fonctionne pas mais montre bien le principe. Je voudrai que les id correspondants au MAX('date') ne puissent être que ceux dont le paramètre install est à 2 dans la tableB, de manière à remplacer la boucle que je faisais sur la requête toute entière.

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 73
    Points : 100
    Points
    100
    Par défaut
    Je suis arrivé à quelque chose que je pense satisfaisant.
    Si vous avez des remarques c'est toujours bon :

    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 tmp.dr_date, t.production, tmp.id
    FROM tableA t
    INNER JOIN (
    SELECT tmp.id, MAX( `date` ) AS dr_date
    FROM releve_impuls tmp
    JOIN (
    SELECT c.id
    FROM centrale c
    WHERE install_etat =2
    )c ON c.id = tmp.id
    WHERE production<>0
    GROUP BY c.id
    )tmp ON tmp.id = t.id
    AND tmp.dr_date = t.`date`
    WHERE production <>0
    Encore merci !

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    reworker cette partie là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT tmp.id, MAX( `date` ) AS dr_date
    FROM releve_impuls tmp
    JOIN (
    SELECT c.id
    FROM centrale c
    WHERE install_etat =2
    )c ON c.id = tmp.id
    WHERE production<>0
    GROUP BY c.id

    en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT tmp.id, MAX( `date` ) AS dr_date
    FROM releve_impuls tmp
    WHERE production<>0 and exists (select null from centrale c
     where c.id = tmp.id and install_etat =2)
    GROUP BY tmp.id

    Sinon pour votre 1ere requête, pas besoin de passer par une sous-rerquete pour faire une jointure interne

    edit: j'ai édité la proposition ..

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 73
    Points : 100
    Points
    100
    Par défaut
    Merci beaucoup pour tous ces conseils, je vais pouvoir avancer.

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

Discussions similaires

  1. Problème requête sql avec plusieurs jointures
    Par CocoX02 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/02/2015, 13h33
  2. Requête avec plusieurs jointures.
    Par leom4t dans le forum Langage SQL
    Réponses: 6
    Dernier message: 14/03/2011, 17h51
  3. Requête avec plusieurs jointures
    Par spull dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/05/2009, 10h57
  4. Requête avec auto jointure récalcitrante
    Par vmolines dans le forum Langage SQL
    Réponses: 15
    Dernier message: 30/03/2006, 21h31
  5. une requête avec plusieurs INNER JOIN, cmt faire ?
    Par elhosni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/01/2006, 17h55

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