affichage impossible si valeur inexistante

Eléphant du PHP | 258 Messages

03 déc. 2008, 18:00

bonjour

je poste ce message car je me heurte au problème de COUNT. d'après la documentation mysql, cette fonction ne peut pas calculer sur des valeurs inexistantes ou NULL. je cherche une solution pour palier ce problème.

quand une session de formation est crée avec le nombre de places (disons 7), logiquement le nombre de places inscrites sera 0 (zéro) puisqu'à l'instant, il y a personne. donc le nombre de places vacantes sera 7 (en attendant).
en fait, un agent choisit une session de formation sur une liste de sessions et s'y inscrit.
résultat: il m'affiche la liste des sessions qui contiennent uniquement des personnes qui s'inscrivent puisque la fonction WHERE et COUNT retourne des valeurs existantes.
Or, je veux toute la liste des sessions qui devraient afficher le nombre de places restantes, même c'est à 0 (pas d'inscriptions).

avez vous une idée?

merci de vos aides

voici ma syntaxe mysql

Code : Tout sélectionner

SELECT session.id_session, session.session, intitule, commentaires, nomcomplet, horaire_matin, horaire_apres_midi, salle, places, (places - count(agent.id_session)) AS restant, code, date_debut, date_fin, visible FROM session, agent WHERE session.id_session = agent.id_session GROUP BY session.id_session';
voici la structure d'agent

Code : Tout sélectionner

CREATE TABLE `agent` ( `id_agent` int(3) NOT NULL auto_increment, `nom` varchar(50) NOT NULL, `prenom` varchar(50) NOT NULL, `id_session` int(3) NOT NULL, `session` varchar(20) NOT NULL, KEY `id_agent` (`id_agent`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=45 ;

voici la structure de session

Code : Tout sélectionner

CREATE TABLE `session` ( `id_session` int(3) NOT NULL auto_increment, `session` varchar(25) NOT NULL, `intitule` varchar(50) NOT NULL, `commentaires` text NOT NULL, `nomcomplet` varchar(50) NOT NULL, `horaire_matin` varchar(17) NOT NULL, `horaire_apres_midi` varchar(17) NOT NULL, `salle` varchar(10) NOT NULL, `places` varchar(3) NOT NULL, `code` varchar(10) NOT NULL, `date_debut` varchar(17) NOT NULL, `date_fin` varchar(17) NOT NULL, `visible` char(1) default NULL, KEY `id_session` (`id_session`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=21 ;
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver

Eléphant du PHP | 254 Messages

04 déc. 2008, 01:25

Salut,

Ton probleme je pense ne viens pas du count, mais de ta jointure, utilise un left join si tu veux sortir aussi les sessions auxquelles aucun agent ne s'est encore inscrit (et donc les compter)

Et encore dans tous les cas il te faut proteger ton agent.id_session par un IFNULL(agent.id_session,0), en suposant que count(0) fonctionne

Code : Tout sélectionner

SELECT session.id_session, session.session, intitule, commentaires, nomcomplet, horaire_matin, horaire_apres_midi, salle, places, (places - count(IFNULL(agent.id_session,0))) AS restant, code, date_debut, date_fin, visible FROM session LEFT JOIN agent ON session.id_session = agent.id_session GROUP BY session.id_session' ;
Mmmm ... Il doit y avoir plus simple mais c'st tout ce que je peux faire ce soir :)

Eléphant du PHP | 258 Messages

05 déc. 2008, 12:11

excuse moi
j'etais occupé urgent mais revoilà

j'ai testé votre requête.
ca marche mais un petit pb.
normalement, cette requête doit m'afficher le mm nombre de places puisqu'il y a pas d'inscriptions à cette session N° 4.
id_session |places |inscrit | restant
-------------------------------
1 | 5 | 4 | 1
2 | 2 |1 | 1
4 | 6 | 0 | 6
autre idée?

merci beaucoup
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver

Eléphant du PHP | 254 Messages

05 déc. 2008, 17:37

Hum si ce que tu met en citation est le résultat de ma requete, je ne vois pas le probleme, sur 6 place disponible il en reste 6 de libre

Eléphant du PHP | 258 Messages

05 déc. 2008, 18:14

bien sur
je te met le résultat de ta requete

Code : Tout sélectionner

SELECT session.id_session, session.session, places AS Total, count( agent.id_session ) AS inscrits, ( places - count( IFNULL( agent.id_session, 0 ) )) AS Restant FROM session LEFT JOIN agent ON session.id_session = agent.id_session GROUP BY session.id_session
excuse moi (je sais pas comment copier ce résultat )

+------------+----------------+-------+----------+---------+
| id_session | session | Total | inscrits | Restant |
+------------+----------------+-------+----------+---------+
| 2 | Init Word 2007 | 3 | 1 | 2 |
| 3 | Init Word 2005 | 8 | 2 | 6 |
| 4 | Init Word 2007 | 13 | 5 | 8 |
| 19 | Exp SCONET | 2 | 2 | 0 |
| 20 | Exp SCONET | 5 | 0 | 4 |
+------------+----------------+-------+----------+---------+
5 rows in set (0.00 sec)
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver

Eléphant du PHP | 254 Messages

05 déc. 2008, 20:08

ok si je comprend bien il y a un soucis a la session n°20, mais je me rend compte que ma requete est fausse :)
Essaye plutot celle la (pas élégant mais ca marche)

Code : Tout sélectionner

SELECT session.id_session, session.session, places AS Total, (SELECT count(*) FROM agent WHERE session.id_session = agent.id_session) as inscrits, ( places - (SELECT count(*) FROM agent WHERE session.id_session = agent.id_session)) AS Restant FROM session GROUP BY session.id_session ;
Euh je suis en train de tester, la requete semble fonctionner sans les IFNULL

Code : Tout sélectionner

SELECT session.id_session, agent.id_session agent, session.session, places AS Total, count( agent.id_session) AS inscrits, ( places - count( agent.id_session )) AS Restant FROM session LEFT JOIN agent ON session.id_session = agent.id_session GROUP BY session.id_session ;
En fait le COUNT ne compte pas les valeurs NULL, mais ne fait pas d'erreur (ce que je croyais)

Exemple ;

select count(*) from agent; // renvoie le nomnre de ligne de la table agent

select count(id_session) from agent; // renvoie le nombre de ligne de la table agent dont l'id session n'est pas nul

Les deux requetes devraient marcher, la deuxieme etant plus simple tout de meme

Eléphant du PHP | 258 Messages

08 déc. 2008, 10:27

me revoila

ah super, ca marche pour la 2ème.

oh ca me fait du bien!!!

milles mercis

le forum est vraiment utile....

je met en résolu
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver