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:
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:
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 ?