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

Langage SQL Discussion :

Requete SQL - count dans un left join


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Par défaut Requete SQL - count dans un left join
    Bonjour à tous

    Alors apres de longues recherches cet après midi, j'ai un souci dans une de mes requêtes. (j'ai beaucoup cherché, sans trop savoir où chercher, donc je m'en remets à vos compétences )

    Voila la structure basique de mes tables :

    table1(id_table1, var_table1)
    inter(#id_table1, #id_table2)
    table2(id_table2, var_table2)

    Et voici ma requête, assez basique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id_table1, var_table1, id_table2, var_table2 
    FROM table1
    LEFT JOIN inter USING ( id_table1 ) 
    LEFT JOIN table2 USING ( id_table2 )
    Jusque là, rien d'insurmontable, ca me retourne :



    Maintenant voila mon probleme : j'aimerais avoir une colonne supplémentaire qui compte le nombre d'occurrences d'id1 pour chaque ligne. Ex :




    Voila, si quelqu'un sait comment mettre cela en place, merci d'avance pour votre aide

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    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 814
    Billets dans le blog
    14
    Par défaut
    Il y a déjà eu un cas similaire il n'y a pas très longtemps.

    Pour compter, il faut grouper sur id_table1. On fait donc une jointure supplémentaire sur la sous-requête de comptage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT id_table1, var_table1, id_table2, var_table2, tmp.Nombre 
    FROM table1
    LEFT JOIN inter USING ( id_table1 ) 
      LEFT JOIN table2 USING ( id_table2 )
    INNER JOIN (
      SELECT table1.id_table1, COUNT(*) AS Nombre
      FROM table1
      LEFT JOIN inter USING ( id_table1 ) 
      LEFT JOIN table2 USING ( id_table2 )
      GROUP BY table1.id_table1
    ) AS tmp ON tmp.id_table1 = table1.id_table1
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Par défaut
    C'est parfait, merci beaucoup pour cette aide.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous n'avez pas précisé votre SGBD c'est dommage.
    S'il les supporte, une fonction de fenêtrage vient à bout de ce genre de problème très simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t1.id_table1, t1.var_table1,
           t2.id_table2, t2.var_table2,
           count(*) over(partition by t1.id_table1) as nombre
      FROM table1 t1
           LEFT OUTER JOIN (inter it
           INNER JOIN table2 t2
             ON t2.id_table2 = it.id_table2)
             ON it.id_table1 = t1.id_table1;
    Trois remarques :
    1. Dès que vous avez plus d'une table dans une requête, utilisez toujours des alias de table et préfixez toutes les colonnes partout dans la requête
    2. N'utilisez pas USING, vous économisez trois secondes d'écritures mais vous perdez en souplesse - c'est moins pire que NATURAL JOIN cela dit
    3. Comme vous avez une clef étrangère de inter vers table2, vous ne pouvez pas avoir de idtable2 référencé dans inter qui n'existerait pas dans table2.
      Aussi la dernière jointure externe est supperflue, regardez comment j'ai repris ce bloc. Les parenthèses que j'ai écrites ne sont pas obligatoires.

  5. #5
    Membre éclairé Avatar de Jihnn
    Inscrit en
    Décembre 2005
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 330
    Par défaut
    Les screenshots de sa table semble indiquer qu'il utilise phpmyadmin, donc MySQL, donc pas de fonctions de fenêtrage.

    D'ailleurs, j'en profite pour poser une petite question par rapport à la remarque #1 :
    Citation Envoyé par sqlpro
    Surnommez vos tables avec des alias les plus courts possible. Évitez de préfixer les colonnes non ambigües.
    (source)

    Bref, que faut-il privilégier et pourquoi ?

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Disons que pour la machine, les colonnes non ambigües ne posent pas de problème, on gagne en trafic réseau (requêtes plus courtes).

    Maintenant, imaginez une requête avec vingt tables, vingt colonnes dans le select, dix dans le where plus toutes les jointures, où tous les noms de colonnes sont uniques.

    N'aliasez rien, donnez la requête à un collègue et posez-lui une question triviale. S'il est normalement constitué, il devrait vous maudire pendant l'exercice !

    Je reste sur ma position, plus d'une table => aliasez toutes toutes toutes les colonnes.
    Une requête appelée 2.000 fois devrait être dans le cache avec des variables de liaison ou en procédure stockée ; SQLPro a peut-être changé d'avis depuis 2003.

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    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 814
    Billets dans le blog
    14
    Par défaut
    Perso, j'utilise les alias dès qu'il y a jointure parce que c'est moins chiant à écrire avec des alias que sans.
    Et quand j'utilise les alias, je les utilise partout dans la requête et pour toutes les colonnes. Pas d'ambiguïté dans la lecture !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  8. #8
    Membre éclairé Avatar de Jihnn
    Inscrit en
    Décembre 2005
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 330
    Par défaut
    Je le fais aussi, mais après avoir lu le post de Waldar, je me suis souvenu avoir déjà lu le contraire sur le site de SQLPro, alors je me posais la question :-p

    Merci pour les réponses.

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

Discussions similaires

  1. [Requete] Deux count dans une requete
    Par wperezrobles dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 03/10/2006, 09h17
  2. [Tableaux] affichage tableau php apres requete sql count
    Par heteroclite dans le forum Langage
    Réponses: 1
    Dernier message: 13/09/2006, 20h53
  3. requete SQL multichamps/dans une liste de valeur
    Par maxidoove dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/07/2006, 15h48
  4. Comment executer une requete sql delete dans une jsp ?
    Par DarkWark dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 24/05/2006, 16h59
  5. count() dans *plusieurs* LEFT JOIN
    Par silver_dragoon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2004, 17h20

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