Requête COUNT et sous requête

Mammouth du PHP | 965 Messages

06 juil. 2009, 10:40

Bonjour,

Le titre n'est pas très explicite ce que je cherche à faire c'est sélectionner des éléments d'un état et les produits se rapportant à cette élément mais avec un état différent :

J'ai des annonces, et des éléments pour ces annonces chacun de ces éléments peut avoir un état (1,2,3,4,5,6,7,8).

Ce que je souhaite faire c'est d'avoir toute les annonces qui ont des éléments différents de 7 mais aussi de compter ceux en état 3.

Pour l'instant j'arrive à ça :

Code : Tout sélectionner

SELECT COUNT(Id_cat_prod) As NbLotDispo,cat.Id As Id_prog,cat.Ville,cat.Cp,cat.Nom FROM cat_prod_id INNER JOIN cat ON (cat.Id = cat_prod_id.Id_cat) INNER JOIN cat_prod ON (cat_prod.Id = cat_prod_id.Id_cat_prod) WHERE Id_cat_region LIKE '".(!isset($_GET['region']) ? '%' : $_GET['region'])."' AND Id_cat_prod_etat != 7 AND cat.Id_online = 1 AND cat_prod_id.Id_online = 2 GROUP BY cat_prod_id.Id_cat ORDER BY NbLotDispo DESC,Cp ASC
Mais ça ne compte que les éléments en état différents de 7, comment avoir le COUNT sur les éléments en état 3 ?
Version du serveur: 5.0.51a-3ubuntu5.4
phpMyAdmin - 2.11.3deb1ubuntu1.1

Code : Tout sélectionner

CREATE TABLE IF NOT EXISTS `cat` ( `Id` int(11) NOT NULL auto_increment, `Nom` varchar(255) collate utf8_unicode_ci NOT NULL, `Adresse` varchar(255) collate utf8_unicode_ci default NULL, `Cp` varchar(5) collate utf8_unicode_ci NOT NULL, `Ville` varchar(70) collate utf8_unicode_ci NOT NULL, `Id_cat_region` int(10) NOT NULL, `Photo_0` varchar(255) collate utf8_unicode_ci default NULL, `Photo_1` varchar(255) collate utf8_unicode_ci default NULL, `Photo_2` varchar(255) collate utf8_unicode_ci default NULL, `Id_online` int(1) NOT NULL default '0', UNIQUE KEY `Id` (`Id`), KEY `id_region` (`Id_cat_region`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=59 ;
cat_prod_id :

Code : Tout sélectionner

CREATE TABLE IF NOT EXISTS `cat_prod_id` ( `Id_cat_prod` int(11) NOT NULL, `Id_cat` int(11) NOT NULL, `Id_cat_prod_genre` int(10) NOT NULL, `Id_cat_prod_orient` int(10) NOT NULL, `Id_cat_prod_etat` text collate utf8_unicode_ci NOT NULL, `Id_user` int(11) NOT NULL, `Id_online` int(1) NOT NULL default '0', PRIMARY KEY (`Id_cat_prod`), KEY `id_programme` (`Id_cat`), KEY `id_genre` (`Id_cat_prod_genre`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Normalement ça devrait être suffisant pour les tables.

D'avance merci.

Administrateur PHPfrance
Administrateur PHPfrance | 977 Messages

06 juil. 2009, 14:08

j'ai pas bien compris ta demande, tu veux avoir le nombre a avoir un etat de 3 ?

et si dans Id_cat_prod_etat tu as des Id, pourquoi ?

`Id_cat_prod_etat` text collate utf8_unicode_ci NOT NULL,

un champ texte ?
pro : http://www.ohweb.fr -> studio de développement en PHP, expertise en e-commerce, certifié PrestaShop
perso : http://www.olecorre.com -> un dico de termes informatiques

J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

Mammouth du PHP | 965 Messages

06 juil. 2009, 14:16

j'ai pas bien compris ta demande, tu veux avoir le nombre a avoir un etat de 3 ?

et si dans Id_cat_prod_etat tu as des Id, pourquoi ?

`Id_cat_prod_etat` text collate utf8_unicode_ci NOT NULL,

un champ texte ?
Le nombre à être en état de 3 mais qui font partis du programme dont l'ensemble n'est pas en état 7.

Mettons que j'ai 10 programmes chacun contenant 20 éléments, je veux savoir sur ces 10 programmes lesquels ne sont pas vendus (tout en état 7) je fais donc :

Code : Tout sélectionner

SELECT COUNT(Id_cat_prod) As NbLotNonVendus,cat.Id As Id_prog,cat.Ville,cat.Cp,cat.Nom FROM cat_prod_id INNER JOIN cat ON (cat.Id = cat_prod_id.Id_cat) WHERE Id_cat_region LIKE '".$_GET['region']."' AND Id_cat_prod_etat != 7 AND cat.Id_online = 1 AND cat_prod_id.Id_online = 2 GROUP BY cat_prod_id.Id_cat ORDER BY NbLotDispo DESC,Cp ASC
Voilà maintenant j'aimerais que le NbLotNonVenus devienne NbLotDispo donc changer la requête pour toujours avoir des programmes qui n'ont pas forcément de dispo mais qui ne sont pas vendus complètement et le nombre d'éléments de chaque programme disponibles.

Je sais pas si je suis assez clair ?

Pour les tables :

cat = catalogue
cat_prod = catalogue_produit
cat_prod_id =catalogue_produit_identifants

Par exemple dans cat_prod_id je retrouve tout les id (Id_cat_prod_genre, Id_cat_prod_etat, Id_cat_prod_fonction etc etc etc). Et dans cat_prod tout les éléments "textes" comme le nom la ville ou ce genre de choses.