Count sur 2 champs ???

Eléphant du PHP | 108 Messages

14 mars 2008, 16:05

Bonjour à toutes et à tous,

J'ai beau chercher, mais là je n'y arrive pas...
Si vous pouviez m'aider, d'avance merci.

Voilà, dans un select je veux afficher le nombre de résultat qui se trouve dans ma table "annonces"
Ca fonctionne trés bien, de plus que je clique dessus, cela m'affiche bien mon résultat.
Mon code
CREATE TABLE `theme` (
  `id_theme` enum('0','1','2','3','4','5') NOT NULL default '0',
  `theme_site` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`id_theme`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

-- 
-- Contenu de la table `theme`
-- 

INSERT INTO `theme` VALUES ('1', 'Programmes de surveillance');
INSERT INTO `theme` VALUES ('2', 'FEP');
INSERT INTO `theme` VALUES ('3', 'Exigences EXE PREPA');
INSERT INTO `theme` VALUES ('4', 'Rex CAP PREPA');
INSERT INTO `theme` VALUES ('5', 'Rex CSI'); 
le champ "annonces.theme" est le nombre de programme
Le champ "annonces.rex_count" est le nombre de REX
Ces 2 champs sont sur la même ligne de la même table.
$query = "SELECT Id_theme,theme_site,count(annonces.theme) FROM 
theme,annonces WHERE annonces.theme=theme.Id_theme GROUP BY 
theme.Id_theme ORDER BY theme.theme_site ASC";	
$result = mysql_query($query) or die("Invalid query: " . mysql_error().__LINE__.__FILE__);
echo "<select name='theme_product'class=Style39>";
echo "<option value=0 select>--- Tous ---</option>";
While ($data = mysql_fetch_array($result))
{								
echo "<option value =".$data[0].">".$data[1]." (".$data[2].")</option>";
}
echo "</select>";
[/code]

Mon soucis est que je veux connaitre le nombre de résultats de 2 champs de la même table, mais avec un seul seclect.

J'ai essayé ce code qui m'affiche bien les 2 résultats, mais quand je clique sur ma
sélection == o résultat ???

Mon 2° code
$query = "SELECT Id_theme,theme_site,count((annonces.theme) OR (annonces.rex_count)) 
FROM   theme,annonces WHERE annonces.theme=theme.Id_theme OR 
annonces.rex_count=theme.Id_theme GROUP BY theme.Id_theme ORDER BY theme.theme_site ASC";	
$result = mysql_query($query) or die("Invalid query: " . mysql_error().__LINE__.__FILE__);
echo "<select name='theme_product'class=Style39>";
echo "<option value=0 select>--- Tous ---</option>";
While ($data = mysql_fetch_array($result))
{								
echo "<option value =".$data[0].">".$data[1]." (".$data[2].")</option>";
}
echo "</select>";
Voilà ce que j'ai mis pour l'affichage
if ((isset($_POST["theme_product"])) OR (isset($_POST["rex_count_product"]))) 
{
$_SESSION["theme"] = (!empty($_POST["theme_product"])) ? " AND annonces.theme='".replace_quot
($_POST["theme_product"])."'" : "";	

$_SESSION["rex_count"] = (!empty($_POST["rex_count_product"])) ? " AND annonces.rex_count='".replace_quot
($_POST["rex_count_product"])."'" : "";
}
Je sais trés bien que si je fais 2 select, tout ira trés bien, mais je n'en veux pas.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

14 mars 2008, 18:11

Je sais trés bien que si je fais 2 select, tout ira trés bien, mais je n'en veux pas.
...et pourquoi ça ?

Tes exemples contiennent une grosse quantité de code PHP qui nuit à la compréhension. Poste tes requêtes bien formattées et telles qu'elles sont exécutées, c'est beaucoup plus utile que de savoir que tu utilises des variables de session ou une fonction replace_quot() (?).

De plus, ce passage

Code : Tout sélectionner

count((annonces.theme) OR (annonces.rex_count))
...est probablement faux. Cela équivaut à un simple COUNT(*)

Dernière chose, il manque le schéma de la table "annonces"

Eléphant du PHP | 108 Messages

15 mars 2008, 09:04

Si je ne veux pas d'autre select, c'est que je souhaite simplement faire une recherche par des noms bien precis, que je selectionne dans la table "theme".
Je te presente ma table " annonces"
CREATE TABLE `annonces` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `id_membre` int(10) unsigned NOT NULL default '0',  
  `surveillant` varchar(120) NOT NULL default '',
  `theme` enum('0','1','2','3','4','5') NOT NULL default '0', 
  `rex_count` enum('0','1','2','3','4','5') NOT NULL default '0',  
  `titre` text NOT NULL,
  `rex` text NOT NULL,
  `emploi` varchar(255) NOT NULL default '',
  `redacteur_rex` varchar(120) NOT NULL default '',  
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Jusqu'au champ "theme" c'est que la personne a créé un programme.
Ensuite, les autres champs sont renseigné que si le rex du programme a été réalisé.
Et là est mon soucis.
Mon select me donne bien le résultat mais à l'affichage il me donne O.

Francis

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Mammouth du PHP | 19672 Messages

15 mars 2008, 09:41

Le truc que je vois, c'est un défaut de conception.

Tu as d'une part une table theme et d'autre part une table annonces. Or dans cette dernière, tu as une colonne theme qui devrait être une clé étrangère nommée theme_id et non une colonne ordinaire. De plus, cette clé ne devrait pas être de type ENUM mais TINYINT UNSIGNED. Si tu veux un jour ajouter un thème avec ton système actuel, il te faudra aller modifier les deux tables pour ajouter les valeurs appropriées, ça n'a rien de rationnel.

Je suggère donc de modifier ce point avant d'aller plus loin :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 108 Messages

15 mars 2008, 10:07

Je ne comprends pas ce que tu me proposes !!!
Car avec le code que j ai mis en place, il me fournit bien le résultat souhaité de mes 2 champs de la table "annonces".
Le seul soucis est que j'arrive à connaitre le résultat et à afficher "annonces.theme" mais pour "annonces.rex_count" il me donne un résultat mais à l'affichage il m'affiche O.
query = "SELECT Id_theme,theme_site,count((annonces.theme) AND (annonces.rex_count)) FROM  theme,annonces WHERE annonces.theme=theme.Id_theme OR annonces.rex_count=theme.Id_theme GROUP BY theme.Id_theme ORDER BY
 theme.theme_site ASC";	
$result = mysql_query($query) or die("Invalid query: " . mysql_error().__LINE__.__FILE__);
echo "<select name='theme_product'class=Style39>";
echo "<option value=0 select>--- Tous ---</option>";
While ($data = mysql_fetch_array($result))
{								
echo "<option value =".$data[0].">".$data[1]." (".$data[2].")</option>";
}
echo "</select>";
J'ai entendu parler de "HAVING" et "DISTINCT" ???

Francis

Mammouth du PHP | 19672 Messages

15 mars 2008, 11:11

Si tu n'as pas saisi ce que je t'ai expliqué, c'est que tu l'as lu un peu trop vite.

Ce que tu veux faire est tout à fait possible mais pas de la manière dont tu t'y prends.
De plus, ce passage

Code : Tout sélectionner

count((annonces.theme) OR (annonces.rex_count))
...est probablement faux.
Là, tu as remplacé le "OR" par "AND", c'est tout aussi invalide.

Mais pour faire des requêtes optimisées, il faudrait avoir une base normalisée avec des relations convenablement construites. Essayer d'optimiser des requêtes sur une base mal construite, c'est essayer de jouer du Mozart sur une casserole : faire ça ou pisser dans un violon, ça fera pas une meilleure musique ;)

Donc je suggère de poser le problème à plat : on a deux tables. Les annonces d'une part, et les thèmes d'autre part. Une annonce correspond à un et un seul thème, alors qu'à un thème peuvent correspondre 0 à n annonces. Pour qu'on avance, il faudrait nous expliquer à quoi correspond le "rex_count" par rapport à tout ça, là je n'ai pas saisi de quoi il s'agit. Est-ce qu'il y a un lien avec une troisième table ou quelque chose du genre ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 108 Messages

15 mars 2008, 11:59

Le champ "annonces.rex_count" et "annonces.theme" sont reliés à la table "theme"

Mammouth du PHP | 19672 Messages

15 mars 2008, 12:01

pour annonces.theme, je l'avais compris, par contre je ne comprends toujours pas à quoi correspond rex_count :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 108 Messages

15 mars 2008, 12:08

Quand la personne créé un programme, cela s'affiche dans "annonces.theme"
Ensuite, cette meme personne fait un retour d'experience "REX" concernant le programme qu'elle a créé. Là ça rempli le champ "annonces.rex_count" sur la meme ligne que "annonces.theme"

Mammouth du PHP | 19672 Messages

15 mars 2008, 12:12

Est-ce que la valeur stockée dans la colonne annonces.theme peut être différente de celle stockée dans la colonne annonce.count_rex ? C'est quoi cette valeur : un lien vers la table theme ou un nombre de retours d'expériences ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 108 Messages

15 mars 2008, 12:18

Oui elle sont differentes
Dans "annonces.theme "on trouvera toujours 1
Dans "annonces.rex_count" on trouvera toujours 5
Ces valeurs c'est ce que l'on trouve dans la table "theme"

Mammouth du PHP | 19672 Messages

15 mars 2008, 12:26

Dans "annonces.theme "on trouvera toujours 1
Dans "annonces.rex_count" on trouvera toujours 5
Donc ces deux colonnes en fin de compte ne servent à rien puisque la valeur est de toutes façons connue :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 108 Messages

15 mars 2008, 12:47

Elles sont connue à partir du momment ou le programme a été creer ainsi que pour le rex.
Si le rex n'est pas créé "=0" mais le programme peut etre créé "==1"

Si le rex est créé "=5" et le programme créé "==1" cela doit me donner les 2 resultats.
Si le rex n'est pas créé "=0" et le programme créé "==1" cela doit me donner 1 resultat.
Si le programme' n'est pas créé "=0" donc le rex "==0" cela doit me donner 0 resultat.

Mammouth du PHP | 19672 Messages

15 mars 2008, 13:25

Bien, on avance :)

Maintenant on sait qu'en fait, le rex est en fin de compte un booléen : c'est soit oui, soit non. Quant au thème, c'est celui correspondant à la ligne appropriée de la table theme

On en revient donc à ce que j'ai expliqué plus tôt : la colonne annonces.theme devrait être theme_id et c'est une clé étrangère dans la table annonces. Quant à la colonne annonces.rex_count, ça devrait être annonce_rex (tout court) de type ENUM('oui','non') avec en valeur par défaut 'non'

Partant de là, essaye de formuler le résultat de ce que tu veux obtenir. Compter sur deux colonnes : Compter quoi et selon quel critères ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 108 Messages

15 mars 2008, 13:35

Ok, je vais essayer de mettre ça en place
merci pour ton aide.
Demain je repost pour te donner mes resultats.

Francis