requete mal construite??

Eléphant du PHP | 258 Messages

24 nov. 2008, 10:50

Bonjour

je m'adresse à vous
je prepare une liste sous forme de tableau tout en récupérant des données issues de deux tables
cette liste m'affichera plusieurs colonnes
- la premiere : les numéros (ceux des id_session)
- la deuxième : total des places
- la 3ème: le nombre de places inscrites (sera calculé à partir d'une requete)
- la 4ème : le nombre de places disponibles (sera calculé à partir d'une requete)

donc les deux dernieres colonnes doivent faire des calculs à partir de ces données dans les deux tables
- pour la 3ème, voici le code sql
SELECT session.id_session, places, count(agent.id_session) AS Inscrits, (places - Inscrits) AS Restant FROM session, agent WHERE session.id_session = agent.id_session AND visible = "O" GROUP BY id_session

resultat: la requete m'annonce "impossible" alors il y aurait un erreur dans cette requete?


Voici la structure "agents"

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=InnoDB DEFAULT CHARSET=latin1;
voici la structure "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=InnoDB DEFAULT CHARSET=latin1;
voici le code php
<?php
 	include('admin/fonctions.php');
 	connLocalhost();
	
// ------------ sélection des paramètres pour générer un tableau ------------
$sql_total	=	'SELECT  session.id_session, places, count(agent.id_session) AS Inscrits, (places - Inscrits) AS Restant FROM session, agent WHERE session.id_session = agent.id_session AND visible = "O" GROUP BY id_session';
$req	=	mysql_query($sql_total)or die ('impossible');// 

$list 	=	mysql_num_rows($req);
$row = mysql_fetch_array($req);

// include du fichier header
	include("admin/header.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
<title></title>
<link rel="stylesheet" type="text/css" href= "admin/gestioforma.css">
</head>
<body class="body">
<div id="contenu"><div id="connect_agent">
<br>

<?php 



if($list) 
		echo '<table style="text-align: left; width: 100%; height: 74px;" border="0" cellpadding="2" cellspacing="2"><tbody>'."\n";
{
	// début du tableau
        // première ligne on affiche les titres prénom et surnom dans 2 colonnes
        echo '<tr><td bgcolor="#669999"><u>Id</u></td>';
        echo '<td bgcolor="#669999"><u>Total</u></td>';
        echo '<td bgcolor="#669999"><u>Inscrits</u></td>';
        echo '<td bgcolor="#669999"><u>Restant</u></td>';
        echo '</tr>'."\n";
    // lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.
    while($row = mysql_fetch_array($req)) 
    {
        echo '<tr style="background-color: #BBAA99;">';
		$bgcolor =($i++&1)?'#DDFF00' : '#BBCC33';
		echo "<tr bgcolor='".$bgcolor."' style='color:black';>";
  		echo "<td>".$row['id_session']."</td>";
		echo "<td>".$row['places']."</td>";
  		echo "<td></td>";
  		echo "<td></td>";
 			
	}
  		echo '</tr>'."\n";
    }
    echo '</table>'."\n";

?>

<br> 
</div>
<?php
	mysql_free_result($req);
//-------------------------------------------------------
//	include du fichier footer
	include("admin/footer.php") ;
?>
</div>
</body>
</html>
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

24 nov. 2008, 14:46

Bonjour,

Remplace
or die ('impossible');
par
or die ('impossible / Erreur MySQL : '.mysql_error().'<br />Requète SQL : '.$sql_total);
Ce qui te permettra d'afficher l'erreur que renvoie MySQL ainsi que la requête que tu as envoyé.
Si tu ne vois pas où est le problème sur ta requête, debug là dans phpmyadmin
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 258 Messages

24 nov. 2008, 15:47

ah oui c'est vrai
j'avais pas pensé à cç

et voici le message d'erreur:

Code : Tout sélectionner

impossible/ Erreur MySQL : Unknown column 'Inscrits' in 'field list' Requète SQL : SELECT session.id_session, places, count(agent.id_session) AS Inscrits, (places - Inscrits) AS Restant FROM session, agent WHERE session.id_session = agent.id_session AND visible = "O" GROUP BY id_session
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

24 nov. 2008, 17:14

Et ?

Tu en conclus quoi de ce message d'erreur ? :)

Qu'est-ce qui pose problème à MySQL ? Que faut-il modifier pour que ta requête fonctionne selon toi ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 258 Messages

25 nov. 2008, 11:21

je conclus qu'il y a un problème de nom dans la colonne inscrits.
je pense que php est incapable de reconnaitre ce type: alias de colonnes.
Seul, sql le reconnait

Code : Tout sélectionner

count(agent.id_session) AS Inscrits
je sais pas comment résoudre ce pb...
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

25 nov. 2008, 11:58

Bonjour,

Je pense que ton problème doit venir du calcul des places restantes car la réutilisation d'un count() pour refaire un calcul dans la même requête me parait délicate pour MySQL:

Code : Tout sélectionner

(places - Inscrits)
Mon conseil serait, soit de faire une première requête

Code : Tout sélectionner

SELECT count(agent.id_session) AS Inscrits FROM agent WHERE visible = "O" GROUP BY id_session
et d'insérer le résultat avec du PHP dans ta 2nde requête.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 258 Messages

25 nov. 2008, 13:14

Serait-il possible d'utiliser UNION?
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

25 nov. 2008, 15:57

C'est effectivement la colonne "Inscrits" que MySQL ne connait pas lorsque tu lui demandes de faire le calcul (places - Inscrits).

Un UNION ne te permettra que de mettre à la suite les enregistrements retournés par plusieurs requêtes.

Tu peux comme le suggère @rthur faire une requête indépendante pour compter le nombre d'inscrits, soit dans ta requête actuelle réutiliser le count() dans le calcul : (places - count(agent.id_session)) au lieu de faire appel à l'alias que MySQL ne connait pas à ce moment de l'exécution.

Tu peux encore, ce qui sera à mon avis bien plus simple, retourner uniquement le nombre d'inscrits et le nombre de places, et laisser le soin à php de faire le calcul de la différence :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 258 Messages

26 nov. 2008, 11:11

finalement

j'ai réussi à faire une seule requête

la voici

Code : Tout sélectionner

$sql = 'SELECT session.id_session, session.places, count(agent.id_session) AS Inscrits, (places - count(agent.id_session)) AS restant FROM session, agent WHERE session.id_session = agent.id_session AND visible = "O" GROUP BY agent.id_session';
merci qd mm de m'avoir donné des idées
à plus
Cordialement
---------------------------------------------------------
Cyphos utilise
- Firefox et Google Chrome dernière version
- Windows Seven ou Windows XP SP3,
- Wampserver