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

PHP & Base de données Discussion :

count() et group by


Sujet :

PHP & Base de données

  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut count() et group by
    Bonjour,
    J'ai 2 tables :
    • table albums (id, titre)
    • table titres (id, titre, album_id)

    Je souhaite avoir le nombre de titres par album ?
    Comment le faire?

    Merci d'avance...

  2. #2
    Membre émérite
    Inscrit en
    Juillet 2003
    Messages
    625
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 625
    Par défaut
    Bonjour,

    je l'ai pas testée mais ça devrait s'en approcher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT COUNT(titres.id), albums.titre FROM albums 
    INNER JOIN titres ON titres.album_id = albums.id GROUP BY albums.titre
    http://sqlpro.developpez.com/cours/sqlaz/ensembles/#L1

  3. #3
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Bonjour,

    personnellement, vu qu'un album contient n titres et qu'un titre peut se trouver dans n albums, j'aurais fait une table de jonction avec en clé primaire l'association des clés étrangères album_id et titre_id et l'attribut titre

    intérêt : garantir l'intégrité

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    Citation Envoyé par Madfrix Voir le message
    Bonjour,

    personnellement, vu qu'un album contient n titres et qu'un titre peut se trouver dans n albums, j'aurais fait une table de jonction avec en clé primaire l'association des clés étrangères album_id et titre_id et l'attribut titre

    intérêt : garantir l'intégrité
    Dans ce cas, une idée de la requête folle furieuse?

    Merci d'avance...

  5. #5
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Quelque chose comme ca :

    les tables :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
     
    CREATE TABLE IF NOT EXISTS `albums` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `titre` varchar(50) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
     
     
    INSERT INTO `albums` (`id`, `titre`) VALUES
    (1, 'titre_album_1'),
    (2, 'titre_album_2'),
    (3, 'titre_album_3');
     
    CREATE TABLE IF NOT EXISTS `album_titres` (
      `album_id_fk` int(11) NOT NULL,
      `titre_id_fk` int(11) NOT NULL,
      PRIMARY KEY (`album_id_fk`,`titre_id_fk`),
      KEY `fk_titre` (`titre_id_fk`),
      KEY `fk_album` (`album_id_fk`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
     
    INSERT INTO `album_titres` (`album_id_fk`, `titre_id_fk`) VALUES
    (1, 1),
    (2, 1),
    (1, 2),
    (1, 3),
    (2, 4),
    (1, 5),
    (3, 5),
    (3, 6),
    (1, 7),
    (3, 7),
    (3, 8),
    (1, 9),
    (2, 9),
    (3, 9),
    (2, 10),
    (3, 10);
     
     
    CREATE TABLE IF NOT EXISTS `titres` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `titre` varchar(50) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
     
     
    INSERT INTO `titres` (`id`, `titre`) VALUES
    (1, 'titre1'),
    (2, 'titre2'),
    (3, 'titre3'),
    (4, 'titre4'),
    (5, 'titre5'),
    (6, 'titre6'),
    (7, 'titre7'),
    (8, 'titre8'),
    (9, 'titre9'),
    (10, 'titre10');
     
     
    ALTER TABLE `album_titres`
      ADD CONSTRAINT `album_titres_ibfk_3` FOREIGN KEY (`album_id_fk`) REFERENCES `albums` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
      ADD CONSTRAINT `album_titres_ibfk_4` FOREIGN KEY (`titre_id_fk`) REFERENCES `titres` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

    La requête
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT albums.titre, COUNT(*) as nb_titres FROM albums
    INNER JOIN album_titres 
    ON album_titres.album_id_fk = albums.id
    INNER JOIN titres
    ON album_titres.titre_id_fk = titres.id
    GROUP BY albums.titre

    titre_album_1 6
    titre_album_2 4
    titre_album_3 6
    Et voilà ton intégrité est respectée et cerise sur le gateau, le moteur innoDb te met à jour la table album_titres si tu supprime/update les tables albums et titres

    PS: crée la table album_titres en dernier dans ta base

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    Merci, je teste et reviens à vous les maîtres...

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    Sur meme principe, j'ai fait cette requette :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT styles.libelle, COUNT(*) AS nb_albums FROM styles
    INNER JOIN album_styles 
    ON album_styles.style = styles.id
    INNER JOIN albums
    ON album_styles.album = albums.id
    GROUP BY styles.libelle
    Elle marche bien, mais je n'ai pas les libellés des styles (styles.libelle) dont les nb_albums est égal à 0.

    Comment afficher tous mes libellés meme ceux qui ne sont liés à aucun album donc 0 pour le cas.

    Merci d'avance..

  8. #8
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Il te faut faire des jointures LEFT ou RIGHT selon le cas.

    De la lecture

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    Citation Envoyé par okoweb Voir le message
    Sur meme principe, j'ai fait cette requette :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT styles.libelle, COUNT(*) AS nb_albums FROM styles
    INNER JOIN album_styles 
    ON album_styles.style = styles.id
    INNER JOIN albums
    ON album_styles.album = albums.id
    GROUP BY styles.libelle
    Elle marche bien, mais je n'ai pas les libellés des styles (styles.libelle) dont les nb_albums est égal à 0.

    Comment afficher tous mes libellés meme ceux qui ne sont liés à aucun album donc 0 pour le cas.

    Merci d'avance..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT styles.libelle, COUNT(*) AS nb_albums FROM styles
    LEFT JOIN album_styles 
    ON album_styles.style = styles.id
    INNER JOIN albums
    ON album_styles.album = albums.id
    GROUP BY styles.libelle
    il me semble que ca sera bon comme ça

  10. #10
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    En effet

  11. #11
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT styles.libelle, COUNT(*) AS nb_albums FROM styles
    LEFT JOIN album_styles 
    ON album_styles.style = styles.id
    LEFT JOIN albums
    ON album_styles.album = albums.id
    GROUP BY styles.libelle
    Ceci me retoune déjà tous les styles.libelle mais ceux qui ont 0 nb_albums, leur nb_albums maintenant est 1. Ce qui est faux.

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    Essaye comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT styles.libelle, COUNT(albums.titre) AS nb_albums FROM styles
    LEFT JOIN album_styles 
    ON album_styles.style = styles.id
    INNER JOIN albums
    ON album_styles.album = albums.id
    GROUP BY styles.libelle

  13. #13
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    Citation Envoyé par boo64 Voir le message
    Essaye comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT styles.libelle, COUNT(albums.titre) AS nb_albums FROM styles
    LEFT JOIN album_styles 
    ON album_styles.style = styles.id
    INNER JOIN albums
    ON album_styles.album = albums.id
    GROUP BY styles.libelle
    Voici ce que j'ai comme résultat.

    libelle nb_albums
    Jazz 3
    Urban music 2
    World music 3
    Les autres styles n'étant liés à aucun album n'apparaissent pas.
    NB. J'exécute cette requete depuis PhpMyAdmin.

    Merci d'avance...

  14. #14
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Citation Envoyé par okoweb Voir le message
    Merci d'avance...
    Et si tu te documentais un peu au lieu d'attendre les réponses ?

    Lis le lien sur les jointures que je t'ai fourni, tu comprendras pourquoi

  15. #15
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    Merci pour la doc.
    Il fallait faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //LEFT JOIN
    SELECT styles.libelle, COUNT( album_styles.style ) AS nb_albums FROM styles
    LEFT JOIN album_styles ON album_styles.style = styles.id
    GROUP BY styles.libelle
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //RIGHT JOIN
    SELECT styles.libelle, COUNT( album_styles.style ) AS nb_albums FROM album_styles
    RIGHT JOIN styles ON album_styles.style = styles.id
    GROUP BY styles.libelle

  16. #16
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    Est-il possible de réunir les 2 requêtes ci-dessous en une seule unique pour avoir le nombre d'albums et le nombre de titres par style.

    1. Nombre d'albums par style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT styles.libelle, COUNT( album_styles.style ) AS nb_albums FROM styles
    LEFT JOIN album_styles ON album_styles.style = styles.id
    GROUP BY styles.libelle
    2. Nombre de titres par style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT styles.libelle, COUNT( titre_styles.titre ) AS nb_titres FROM styles
    LEFT JOIN titre_styles ON titre_styles.titre = styles.id
    GROUP BY styles.libelle
    J'ai fait ceci, le résultat n'est pas bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT styles.libelle, COUNT( album_styles.style ) AS nb_albums, COUNT( titre_styles.titre ) AS nb_titres FROM styles
    LEFT JOIN album_styles ON album_styles.style = styles.id
    LEFT JOIN titre_styles ON titre_styles.titre = styles.id
    GROUP BY styles.libelle
    Merci d'avance...

  17. #17
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    Je suppose que ce n'est pas possible?

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/10/2007, 16h36
  2. [requete] Probleme de COUNT() et GROUP BY
    Par cadoudal56 dans le forum Requêtes
    Réponses: 6
    Dernier message: 04/12/2006, 19h23
  3. problème count et group by
    Par zulkifli dans le forum Requêtes
    Réponses: 3
    Dernier message: 24/11/2006, 04h53
  4. Requête récalcitrante avec un tri par COUNT sans GROUP BY
    Par Ancalagon77 dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/10/2006, 14h27
  5. Pb de COUNT et GROUP BY simple mais sans requête imbriquées
    Par vanquish dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/10/2004, 09h45

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