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 :

Jointures et COUNT(*) GROUP BY


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 132
    Par défaut Jointures et COUNT(*) GROUP BY
    bonjour,

    Actuellement j'ai deux requêtes pour effectuer:
    1. Pour selectionner les données dont j'ai besoin à l'aide de jointures
    2. Pour récupérer un COUNT(*) GROUP BY pour connaitre un nombre n


    Je procède comme ceci :

    1. Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      SELECT `directory_general`.*, `directory_category`.*, `directory_type`.*, `directory_lang`.* FROM `directory_general` 
      INNER JOIN `directory_category` ON directory_general.site_id = directory_category.site_id 
      INNER JOIN `directory_type` ON directory_general.site_id = directory_type.site_id 
      INNER JOIN `directory_lang` ON directory_general.site_id = directory_lang.site_id 
      WHERE (active = 1) 
      ORDER BY `date_add` DESC
    2. Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      SELECT G.site_id, D.sitename, S.directory_id,  COUNT(*) AS nb_galleries 
      FROM fhg_galleries AS G 
      INNER JOIN fhg_sites AS S ON G.site_id = S.site_id 
      INNER JOIN directory_general AS D ON S.directory_id = D.site_id 
      GROUP BY D.site_id;


    Et voici la structure de mes tables :
    Code SQL : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    mysql> DESCRIBE `fhg_sites`;
    +------------+--------------+------+-----+---------+----------------+ | FIELD      | Type         | NULL | KEY | DEFAULT | Extra          |
    +------------+--------------+------+-----+---------+----------------+ | site_id    | int(11)      | NO   | PRI | NULL    | AUTO_INCREMENT |
    | join_url   | varchar(512) | NO   |     |         |                |
    | banner_url | varchar(512) | NO   |     |         |                |
    +------------+--------------+------+-----+---------+----------------+ 3 rows IN SET (0.00 sec)   mysql> DESCRIBE `fhg_galleries`;
    +------------+--------------+------+-----+---------+----------------+ | FIELD      | Type         | NULL | KEY | DEFAULT | Extra          |
    +------------+--------------+------+-----+---------+----------------+ | gallery_id | int(11)      | NO   | PRI | NULL    | AUTO_INCREMENT |
    | site_id    | int(11)      | NO   | MUL |         |                |
    | DESC       | varchar(512) | NO   |     |         |                |
    | nb_pics    | int(11)      | NO   |     |         |                |
    +------------+--------------+------+-----+---------+----------------+ 4 rows IN SET (0.00 sec)   mysql> DESCRIBE `fhg_images`;
    +------------+--------------+------+-----+---------+----------------+ | FIELD      | Type         | NULL | KEY | DEFAULT | Extra          |
    +------------+--------------+------+-----+---------+----------------+ | image_id   | int(11)      | NO   | PRI | NULL    | AUTO_INCREMENT |
    | gallery_id | int(11)      | NO   | MUL |         |                |
    | url_full   | varchar(512) | NO   |     |         |                |
    | url_thumb  | varchar(512) | NO   |     |         |                |
    +------------+--------------+------+-----+---------+----------------+   mysql> DESCRIBE `directory_general`;
    +----------------+--------------+------+-----+---------+----------------+ | FIELD          | Type         | NULL | KEY | DEFAULT | Extra          |
    +----------------+--------------+------+-----+---------+----------------+ | site_id        | int(11)      | NO   | MUL | NULL    | AUTO_INCREMENT |
    | sitename       | varchar(96)  | NO   |     | NULL    |                |
    | url            | varchar(512) | NO   |     | NULL    |                |
    | DESC           | text         | NO   |     | NULL    |                |
    | VIEW           | int(11)      | NO   |     | NULL    |                |
    +----------------+--------------+------+-----+---------+----------------+ 10 rows IN SET (0.01 sec)


    En fait ce que je veux récupérer c'est le nombre de galleries présente pour un site (s'il y en a) à l'aide COUNT(*) AS nb_galleries GROUP BY `directory_general.site_id;` dans ma requête principale et ainsi avoir toutes les informations nécessaires dans une seule requête.

    Merci

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Si je lis bien vos requêtes, la première va donner une liste d'images en indiquant dans quelles galeries de quels sites elles se trouvent et la seconde va donner un nombre de galeries par site.

    D'après votre besoin :
    nombre de galeries présentes pour un site (s'il y en a)
    La seconde requête est suffisante il me semble.

    Ou alors précisez votre besoin.

    Remarque : J'ai mis des retours à la ligne dans les requêtes pour que celles-ci soient plus lisibles.
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 132
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Remarque : J'ai mis des retours à la ligne dans les requêtes pour que celles-ci soient plus lisibles.
    Merci

    À la lecture de votre interprétation, j'ai réalisé que je n'avais pas posté la bonne requête.. j'ai donc éditer mon poste pour corriger.

    Cela dit ma question reste entière, j'aimerai pouvoir récupérer donc ce nombre pour chaque site que je récupère à travers ma première requête.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Si je comprends bien, vous voulez toutes les infos des 'directory', lesquelles sont réparties dans 4 tables, pour chaque site ayant au moins une galerie ?

    Qu'est-ce qui vous empêche de mettre les jointures de directory de la première requête dans la seconde ?
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT G.site_id, D.*,  COUNT(*) AS nb_galleries, 
    DC.*, DT.*, DL.*   
    FROM fhg_galleries AS G 
    INNER JOIN fhg_sites AS S ON G.site_id = S.site_id 
      INNER JOIN directory_general AS D ON S.directory_id = D.site_id 
        INNER JOIN directory_categories AS DC ON D.site_id = DC.site_id 
        INNER JOIN directory_type AS DT ON D.site_id = DT.site_id 
        INNER JOIN directory_lang AS DL ON D.site_id = DL.site_id 
    WHERE (STATUS = 1)
    GROUP BY D.site_id;

    Au fait, Status est dans quelle table ? Ce serait bien de le préciser et c'est un mot du langage donc plutôt à éviter comme nom de colonne.
    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 !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 132
    Par défaut
    d'accord, status est une colonne de la table directory_general, noté pour la remarque je changerai le nom pour 'active'

    sinon, c'est ça la requête sauf que j'aimerai pouvoir récupérer tous les sites en fait, et indiqué nb_galleries à 0 s'il y en a pas (ou NULL) peu importe..

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Les sites sont répertoriés dans fgh_sites ?

    Il faut utiliser un LEFT JOIN pour avoir tous les sites et un NULL quand il n'y a pas de galerie.
    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 !

Discussions similaires

  1. Aide count group by
    Par olibara dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2008, 11h38
  2. COUNT, GROUP BY et HAVING
    Par yobogs dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/10/2007, 13h34
  3. Problème de requete, COUNT, GROUP BY etc.
    Par TheRedLed dans le forum Requêtes
    Réponses: 3
    Dernier message: 22/05/2007, 15h03
  4. Requete SQL : COUNT GROUP BY
    Par Florent08800 dans le forum Requêtes
    Réponses: 3
    Dernier message: 06/10/2006, 10h04
  5. fonction: renvoyer résultat d'un count .. group by ?
    Par ctobini dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 26/09/2006, 14h21

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