requete mal construite??

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : requete mal construite??

par Cypher_PHP » 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

par Ryle » 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 :)

par Cypher_PHP » 25 nov. 2008, 13:14

Serait-il possible d'utiliser UNION?

par @rthur » 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.

par Cypher_PHP » 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...

par Ryle » 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 ?

par Cypher_PHP » 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

par @rthur » 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

requete mal construite??

par Cypher_PHP » 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>