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 :

select count avec jointure, en récupérant les 0


Sujet :

Langage SQL

  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
    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
    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
    Je viens de me rendre compte que je me suis sans doute trompé de sous-forum, je vais reposter cette colle dans le forum mysql. Comment puis-je le supprimer d'ici ?

  3. #3
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    La jointure externe (LEFT OUTER JOIN), qui te renvoie les lignes de gauches même lorsqu'il n'y a pas de correspondance à droite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     SELECT COUNT(*) AS `nb` , `k_category`.`id` , `k_category`.`label` 
    FROM `datingsim`.`k_category`  JOIN `datingsim`.`k_language` 
    ON AND `k_language`.`iso` = `k_category`.`isolanguage`
    LEFT OUTER JOIN (`datingsim`.`k_article_has_category` JOIN `datingsim`.`k_article` ON `k_article`.`id` = `k_article_has_category`.`idarticle`)
    ON `k_category`.`id` = `k_article_has_category`.`idcategory`
    WHERE `k_language`.`iso` = 'fr'
    GROUP BY `k_category`.`label`, `k_category`.`id`
    LIMIT 0 , 30

Discussions similaires

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

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