IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Optimisation requête avec SELECT COUNT [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 110
    Points : 73
    Points
    73
    Par défaut Optimisation requête avec SELECT COUNT
    Bonjour,

    J'ai réalisé le script suivant qui me donne satisfaction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    // Requètes
    			$retour_total  = mysql_query('SELECT COUNT(*) AS refer  FROM famille WHERE situation="Nouveau"') or die("Erreur SQL: ".mysql_error() . "<br />Requete : $requete");
    			$retour_tot    = mysql_query('SELECT COUNT(*) AS total  FROM famille WHERE situation="Classé"') or die("Erreur SQL: ".mysql_error() . "<br />Requete : $requete");
    			$retour_total2 = mysql_query('SELECT COUNT(*) AS total2 FROM famille WHERE situation="Ré inscrit"') or die("Erreur SQL: ".mysql_error() . "<br />Requete : $requete");
    			$retour_total3 = mysql_query('SELECT COUNT(*) AS total3 FROM famille WHERE situation="Ancien"') or die("Erreur SQL: ".mysql_error() . "<br />Requete : $requete");
     
    			mysql_close();		
     
     
    			//Total NOUVEAUX
    			$donnees_total =mysql_fetch_assoc($retour_total);
         			$totref =$donnees_total['refer'];			
    			//Total CLASSE
          			$donnees_tot =mysql_fetch_assoc($retour_tot);
          			$tot =$donnees_tot['total'];
    			//Total RE INSCRIT
         			$donnees_total2 =mysql_fetch_assoc($retour_total2);
          			$total2 =$donnees_total2['total2'];		
    			//Total ANCIEN
         			$donnees_total3 =mysql_fetch_assoc($retour_total3);
         			$total3 =$donnees_total3['total3'];		
     
     
    			echo "Nouveau :";
    			echo $totref;
    			echo "<br />";
    			echo "Classé : ";
    			echo $tot;
    			echo "<br />";
    			echo "Ré inscrits :";
    			echo $total2;
    			echo "<br />";
    			echo "Anciens :";
    			echo $total3;
    Mais je me suis demandé s'il n'y avait pas une manière plus optimisée de réaliser ce script. Après plusieurs recherches, j'ai réalisé le script suivant qui lorsque je le teste directement dans Myadmin me sort les bons résultats mais ne m'affiche rien lorsque je le met dans mon script (je travaille en php4)

    Merci d'avance à celui qui m'aidera.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    $requete_optim = mysql_query('SELECT a.cnt, b.cnt, c.cnt, d.cnt
    			FROM 
    			( SELECT COUNT(DISTINCT id_famille) AS cnt FROM famille WHERE situation="Nouveau") AS a,
    			( SELECT COUNT(DISTINCT id_famille) AS cnt FROM famille WHERE situation="Classé") AS b,
    			( SELECT COUNT(DISTINCT id_famille) AS cnt FROM famille WHERE situation="Ré inscrit") AS c,
    			( SELECT COUNT(DISTINCT id_famille) AS cnt FROM famille WHERE situation="Ancien") AS d')or die("Erreur SQL: ".mysql_error() . "<br />Requete : $requete");
    			mysql_close();	
     
    			$donnees_optim =mysql_fetch_assoc($requete_optim);
       			$a =$donnees_optim[a.cnt];
    	  		$b =$donnees_optim['b.cnt'];
    	  		$c =$donnees_optim['c.cnt'];
    	 		$d =$donnees_optim['d.cnt'];
     
     
    			echo "Nouveau :";
    			echo $a;
    			echo "<br />";
    			echo "Classé : ";
    			echo $b;
    			echo "<br />";
    			echo "Ré inscrits :";
    			echo $c;
    			echo "<br />";
    			echo "Anciens :";
    			echo $d;

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    Essaye plutôt cette requête qui est plus simple :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT(*), situation
    FROM famille
    WHERE 1
    GROUP BY situation

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 110
    Points : 73
    Points
    73
    Par défaut
    Mathieu,

    Merci pour cette info mais cela ne règle pas mon problème.

    En effet, dans la partie de script que j'ai donné les clauses WHERE concerne le même champs (situation) mais j'ai d'autres clause WHERE sur des champs différents.

    De plus, comme j'ai testé ma requète dans PhpMyadmin, je me rends bien compte qu'elle fonctionne, et j'ai l'impression que c'est dans la récupération des données ($donnees_optim) qu'il y a quelque chose qui ne va pas et comme je suis dessus depuis 2 jours, je pense qu'il doit y avoir quelque chose qui cloche que je ne vois pas.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $requete_optim = mysql_query('SELECT a.cnt, b.cnt, c.cnt, d.cnt
                FROM 
                ( SELECT COUNT(DISTINCT id_famille) AS cnt FROM famille WHERE situation="Nouveau") AS a,
                ( SELECT COUNT(DISTINCT id_famille) AS cnt FROM famille WHERE situation="Classé") AS b,
                ( SELECT COUNT(DISTINCT id_famille) AS cnt FROM famille WHERE situation="Ré inscrit") AS c,
                ( SELECT COUNT(DISTINCT id_famille) AS cnt FROM famille WHERE situation="Ancien") AS d')or die("Erreur SQL: ".mysql_error() . "<br />Requete : $requete");
                mysql_close();    
     
                $donnees_optim =mysql_fetch_assoc($requete_optim);
                   $a =$donnees_optim[a.cnt];
                  $b =$donnees_optim['b.cnt'];
                  $c =$donnees_optim['c.cnt'];
                 $d =$donnees_optim['d.cnt'];
    Les alias de tables ne servent qu'à l'intérieur de la requête. Elle ne te renvoie pas les colonnes 'a.cnt', 'b.cnt', 'c.cnt' et 'd.cnt' mais 4 fois la colonne 'cnt'. Change l'alias des colonnes et tu obtiendras ton résultat.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 110
    Points : 73
    Points
    73
    Par défaut MERCI BEAUCOUP
    "Mais oui mais c'est bien sûr"
    Les 5 dernières Minutes
    Raymond Souplex
    (pour les CinéPhil ou plutôt les TVPhil !!)

    Deux jours à tourner en rond et tellement sur le script que l'on ne voit pas où cela cloche.

    Merci CinePhil

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par przvl Voir le message
    "Mais oui mais c'est bien sûr"
    Les 5 dernières Minutes
    Raymond Souplex
    (pour les CinéPhil ou plutôt les TVPhil !!)
    Pfiou ! C'est pas jeune ça ! [strike]Série[/strike] "Feuilleton" français en noir et blanc des années 1960, peut-être encore diffusée au début des années 1970.
    On doit être de la même génération, non ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Requête SQL] - Select count avec plusieurs tables
    Par Pithonnette dans le forum SQL
    Réponses: 7
    Dernier message: 25/06/2009, 19h19
  2. [SQL] Problème avec SELECT COUNT(*)
    Par jpascal dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/11/2006, 12h37
  3. optimisation requête avec jointures externes
    Par beurtom dans le forum Oracle
    Réponses: 14
    Dernier message: 16/10/2006, 16h50
  4. Requête et sous requête avec SELECT et UPDATE
    Par Véronique75ca dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 29/06/2006, 21h25
  5. requête avec SELECT imbriqués...
    Par dj_lil dans le forum Langage SQL
    Réponses: 4
    Dernier message: 18/07/2005, 11h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo