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 :

Select count avec jointure, en récupérant les 0 : possible ?


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Points : 10
    Points
    10
    Par défaut Select count avec jointure, en récupérant les 0 : possible ?
    Bonjour à tous,

    Je ne savais pas comment formuler le sujet, je m'excuse si ce n'est pas clair.

    J'ai une table k_article qui contient des articles, une table k_category qui contient des catégories, et une table k_article_has_category qui me permet de savoir à quelle(s) catégorie(s) appartient un article.

    Voici leur structure :

    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
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `k_article`
    -- 
     
    CREATE TABLE `k_article` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `iduser` int(10) unsigned NOT NULL default '0',
      `isolanguage` char(4) NOT NULL default 'en',
      `title` tinytext NOT NULL,
      `hat` mediumtext NOT NULL,
      `text` longtext NOT NULL,
      `date` date NOT NULL default '0000-00-00',
      `status` char(10) NOT NULL default 'normal',
      PRIMARY KEY  (`id`),
      KEY `iduser` (`iduser`,`isolanguage`),
      FULLTEXT KEY `search` (`title`,`text`,`hat`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `k_article_has_category`
    -- 
     
    CREATE TABLE `k_article_has_category` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `idarticle` int(10) unsigned NOT NULL default '0',
      `idcategory` int(10) unsigned NOT NULL default '0',
      PRIMARY KEY  (`id`),
      KEY `idarticle` (`idarticle`),
      KEY `idcategory` (`idcategory`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `k_category`
    -- 
     
    CREATE TABLE `k_category` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `isolanguage` char(5) NOT NULL,
      `label` char(32) NOT NULL,
      `description` char(50) NOT NULL,
      `url_format` char(255) NOT NULL,
      PRIMARY KEY  (`id`),
      KEY `idlanguage` (`isolanguage`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 PACK_KEYS=0 AUTO_INCREMENT=1 ;

    J'aimerais simplement récupérer les noms (champs "label") de chaque catégorie et le nombre d'article par catégorie.

    J'avais fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     SELECT DISTINCT COUNT( `k_article`.`id` ) AS `nb` , `k_category`.`id` , `k_category`.`label` , `k_category`.`label`
    FROM `datingsim`.`k_category` , `datingsim`.`k_article_has_category` , `datingsim`.`k_language` , `datingsim`.`k_article`
    WHERE `k_article`.`id` = `k_article_has_category`.`idarticle`
    AND `k_category`.`id` = `k_article_has_category`.`idcategory`
    AND `k_language`.`iso` = `k_category`.`isolanguage`
    AND `k_language`.`iso` = 'fr'
    GROUP BY `k_category`.`label`
    LIMIT 0 , 30
    Ca fonctionne très bien sauf que si dans ma table de liaison k_article_has_category j'ai une catégorie qui n'a plus d'article associé (suite à la suppression d'un article par exemple), cette requête ne me la récupère pas.

    J'aurais voulu qu'elle me récupère tout de même toutes les catégories et qu'elle me donne "0" dans le cas où elle ne trouve plus d'article associé à cette catégorie.

    Est-ce qu'une bonne âme pourrait m'expliquer un peu comment sortir de ce sac de noeud ?

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    Il faut utiliser l'écriture normalisée (SQL-92) des jointures, pour pouvoir faire des jointures externes (qui ramènent les catégories qui n'ont pas d'articles).
    Cette écriture des jointures est, de toute façon, préférable à l'écriture mettant les conditions de jointures dans la clause WHERE.

    Exemple de requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT `k_category`.`label`, COUNT(`k_article`.`id`)
    FROM `datingsim`.`k_category`
    LEFT JOIN `datingsim`.`k_article_has_category` ON `k_category`.`id` = `k_article_has_category`.`idcategory`
    LEFT JOIN `datingsim`.`k_article` ON `k_article_has_category`.`idarticle` = `k_article`.`id`
    GROUP BY `k_category`.`label`
    ced

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup. J'étais justement en train de lire le cours sur les jointures externes. Décidémment, il va falloir que je me modernise...

    Merci encore infiniment !

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 20/08/2012, 22h44
  2. performance d'un count avec jointures.
    Par bidi dans le forum SQL
    Réponses: 47
    Dernier message: 15/04/2009, 08h30
  3. double count avec jointure
    Par olibara dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/08/2008, 23h25
  4. select count avec jointure, en récupérant les 0
    Par littlewings dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/07/2008, 11h58
  5. Réponses: 3
    Dernier message: 08/11/2006, 23h04

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