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 :

Left join / limit avec condition


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Left join / limit avec condition
    Bonjour,

    J'ai une requête à créer afin d'animer un outil de recherche client sur plusieurs tables/éléments :
    - le total géré (table compte)
    - la ville (table adresse)
    Voici ce que j'en sors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT DISTINCT(USER_intId),t_user.*,SUM(COMPTE_dblUnites*COMPTE_dblValeur) AS total
    FROM t_user
        LEFT JOIN (SELECT * FROM t_adresse WHERE  ADRESSE_FK_USER_ID=USER_intId ORDER BY ADRESSE_intId LIMIT 1) Ad
                    ON Ad.ADRESSE_FK_USER_ID=USER_intId
     
                    INNER JOIN t_compte ON COMPTE_FK_CONTRAT_ID = CONTRAT_intId
     
                    WHERE ...
                    GROUP BY USER_intId
                    HAVING...
                                    ORDER BY total DESC
    La table adresse contient 4 adresses par user, mais j'aimerais que la recherche ne s'effectue que sur la première (sinon le montant final est multiplié par 4 [...]).

    Mon problème est que dans la sous requête du LEFT JOIN, le "USER_intId" (de la requête principale) n'est plus définie.

    J'ai essayé tellement de façon différente que je suis totalement paumé.

    Merci d'avance de vos lumières ^^

  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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Pourriez-vous exprimer le besoin par une phrase en français ?
    Je lis la requête mais j'ai du mal à comprendre à quoi elle est sensée servir.
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    En "clair", je souhaite sortir les enregistrements clients (t_user) et son total géré associé (jointure avec t_compte) par une requête sur la ville d'habitation de la 1ère adresse sur 4 (jointure avec t_adresse).
    Chaque client ayant 4 adresses distinctes.

    Voici une requête générée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT DISTINCT(USER_intId),t_user.*,SUM(COMPTE_dblUnites*COMPTE_dblValeur) AS total 
    FROM t_user 
    
    LEFT JOIN (SELECT * FROM t_adresse WHERE ??? ORDER BY ADRESSE_intId LIMIT 1) A 
    ON A.ADRESSE_FK_USER_ID=USER_intId 
    
    INNER JOIN t_compte ON COMPTE_FK_CONTRAT_ID = CONTRAT_intId 
    WHERE ADRESSE_strVille="Paris" 
    GROUP BY USER_intId 
    HAVING total >= "500000" AND total <= "700000" 
    ORDER BY total DESC
    J'espère que cela vous aidera à me comprendre.

    NB : Je ne suis pas sûr du tout de la syntaxe du left join.

  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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Qu'est-ce qui détermine le fait qu'une adresse est la première ?
    Il n'y a pas d'ordre a priori dans une table. C'est comme un sac de bille : je vous donne le sac, vous ne savez pas quelle est la dernière bille insérée !

    De quelle table vient CONTRAT_intID dans la jointure avec la tabel t_compte ?

    Pour obtenir la première adresse de chaque user, un coup d'oeil sur cette source MySQL devrait aider.
    Ca devrait donner ça dans votre cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT u.USER_intId, a.ADRESSE_intId
    FROM t_user
    INNER JOIN t_adresse AS a ON a.ADRESSE_FK_USER_ID = u.USER_intId
    WHERE (
      SELECT COUNT(*)
      FROM t_adresse AS a1
      WHERE a1.ADRESSE_FK_USER_ID = a.ADRESSE_FK_USER_ID
        AND a1.ADRESSE_intId < a.ADRESSE_intId
    ) < 1
    Pourquoi un LEFT JOIN au fait ? Vous voulez calculer pour une "première adresse" à Paris et il y aurait des user sans adresse ? Avec le WHERE il ne seront pas retournés.

    Pour la requête complète, ça pourrait donner ça :
    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 u.USER_intId, 
      SUM(c.COMPTE_dblUnites * c.COMPTE_dblValeur) AS total
    FROM t_user AS u
    INNER JOIN t_adresse AS a ON a.ADRESSE_FK_USER_ID = u.USER_intId
    INNER JOIN t_compte AS c ON c.COMPTE_FK_CONTRAT_ID = CONTRAT_intId -- De quelle table ?
    WHERE a.ADRESSE_strVille = 'Paris'
      AND (
        SELECT COUNT(*)
        FROM t_adresse AS a1
        WHERE a1.ADRESSE_FK_USER_ID = a.ADRESSE_FK_USER_ID
          AND a1.ADRESSE_intId < a.ADRESSE_intId
      ) < 1
    GROUP BY u.USER_intId
    HAVING total >= 500000 AND total <= 700000 
    ORDER BY total DESC
    A essayer.
    Reste la question de la provenance de la colonne CONTRAT_intId !
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Seul l'id d'une adresse détermine le fait qu'elle soit "première".
    De plus, en voulant simplifier au max la requête, certaines incongruités du genre CONTRAT_intId apparaissent (jointure sur 4 tables au départ).
    Enfin, certains client importés depuis différentes sources et fichiers peuvent en effet ne pas disposer d'adresse du tout.

    Merci pour ce nouvel élément que je vais tacher de mettre en pratique.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Un grand merci pour cette solution !

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

Discussions similaires

  1. Requête LEFT JOIN ON si condition
    Par gnain dans le forum Développement
    Réponses: 5
    Dernier message: 30/01/2015, 12h34
  2. LEFT JOIN possible avec ODBC de texte ?
    Par surcouf1 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 25/04/2013, 16h01
  3. LEFT JOIN ON plusieurs conditions
    Par comode dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/09/2011, 14h54
  4. left join et where condition
    Par jobvince dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/09/2010, 16h30
  5. LIMIT avec condition
    Par Lunthear dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/11/2007, 22h15

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