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 :

SELECT COUNT(*) [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 557
    Par défaut SELECT COUNT(*)
    Bonjour, après avoir longtemps cherché des tuto, je ne sais pas me servir de count dans sql, ou bien ça vient du php.

    Voilà,

    j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql_compte_journees="SELECT COUNT(*) As nb FROM $stats.calendrier WHERE score1 <> 20 AND(equipe1='".$equipe."' OR equipe2='".$equipe."') ;";
    $journees=mysql_query($sql_compte_journees);
    echo $journees;
    déjà, à quoi sert le As?? J'ai jamais compris ça.

    Et le count * (pourquoi étoile?), pourquoi des fois on met, SELECT champ1, champ2, count(*) ?

    Bon ça c'est des question satellites, mais déjà si vous pouviez m'aider à comprendre pourquoi quand je fais un echo de $journees, ça m'affiche ceci :

    Resource id #8Resource id #11Resource id #14Resource id #17Resource id #20Resource id #23Resource id #26Resource id #29Resource id #32Resource id #35Resource id #38Resource id #41Resource id #44Resource id #47Resource id #50Resource id #53Resource id #56Resource id #59Resource id #62Resource id #65
    Alors que je voudrais qu'il m'affiche le nombre d'enregistrements, au lieu de me les énumérer...

    (ps, j'ai essayé avec mysql_num_rows, et ça m'affiche 11111111 (le nombre d'enregistrements x 1 si vous préférez, ça me concatène des 1..)

    Merci !

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 450
    Par défaut
    il faut que tu affecte une valeur a count par exemple count(id) ou count(nombre_de_cacahuetes_dans_un_bol_en_terre_cuite) hihi

    Voila, enfin il suffit de remplacer mes exemple par le nom du champ que tu veux calculer

    Enfin je dis cela de memoire ... je ne suis pas sure mais essaye toujours

  3. #3
    Membre éclairé Avatar de JmL40
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 348
    Par défaut
    Salut,

    Voici une proposition, à mon avis, tu oublies de récupérer les enregistrements avec la fonction mysql_fetch_row ou mysql_fetch_array :

    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
     
    <?php	
    	//Mise en place de ta requete SQL
    	$sql_compte_journees=
    	'
    		SELECT 
    			COUNT(*) AS NB_LIGNES 
    		FROM 
    			$stats.CALENDRIER 
    		WHERE 
    			SCOREL <> 20 
    		AND
    			(EQUIPE1 = "'.$equipe.'" OR EQUIPE2 ="'.$equipe.'")
    	';
     
    	//Affichage de la requete
    	echo $sql_compte_journee;
     
    	//Excution de la requete
    	$journees = mysql_query($sql_compte_journees);
     
    	//Recupération des données issues de la requête
    	$donnees_journees = mysql_fetch_row($journees);
     
    	//Affichage du nombre de journées pour EQUIPE1 et EQUIPE 2
    	echo $donnees_journees[0];
    ?>
    En ce qui concerne la fonction COUNT, celle-ci retourne le nombre de valeur non nulles pour une colonne spécifiée en paramètre COUNT(COLONNE) ou l'ensemble des des données d'une table COUNT(*).

    Cordialement

  4. #4
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    En 1er, donc quand tu cherche quelque chose de précis, et bien faut aller du coté de la doc (un réflexe)
    -> http://dev.mysql.com/doc/refman/5.0/...ting-rows.html

    Le AS est un alias, et ce sera grâce à lui où tu pourras faire référence par la suite.
    Dans certain cas, un alias sera obligatoire, ou disons quasi impossible pour pouvoir se référer.

    $sql_compte_journees="SELECT COUNT(*) As nb FROM $stats.calendrier WHERE score1 <> 20 AND(equipe1='".$equipe."' OR equipe2='".$equipe."') ;";
    $journees=mysql_query($sql_compte_journees);
    echo $journees;
    Idem pour Php et la fonction mysql_query()
    -> http://fr2.php.net/manual/fr/function.mysql-query.php
    La fonction mysql_query() retourne une ressource, c'est grâce à cette ressource où tu pourras faire référence pour obtenir toute sorte d'information de la requête exécutée, comme par exemple obtenir le contenu.

    Ensuite, et c'est la particularité du COUNT(), de sa présence dans le SELECT, c'est quelle retournera OBLIGATOIREMENT un résultat.
    Du coup, (et dans ton exemple, j'insiste) faire un mysql_num_rows() devient inutile, car le COUNT contiendra le nombre de ligne.
    C'est du faite que dans ton exemple il y a aucun regroupement (GROUP BY).

    Ici il suffit de faire un mysql_fetch_array($journees).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $sql_compte_journees = "SELECT COUNT(*) As nb FROM $stats.calendrier WHERE score1 <> 20 AND(equipe1='".$equipe."' OR equipe2='".$equipe."')";
    $rs_journees = mysql_query($sql_compte_journees);
    $journees = mysql_fetch_array($rs_journees);
    echo 'Nombre de journées : '.$journees['nb'].'<br />';
    Et le count * (pourquoi étoile?), pourquoi des fois on met, SELECT champ1, champ2, count(*) ?
    Parce que ça dépend de ce qu'on souhaite obtenir.
    Il faut bien comprendre que tout ce qu'il sera dans le SELECT va déboucher sur des colonnes, et les résultats le nombre de ligne. Au bout, c'est un tableau (purement cartésien)
    Si on souhaite juste obtenir le nombre de ligne, et bien il est inutile de rajouter des colonnes qui ne seront pas exploités (ça fera des économies sur les traitements, mémoires).

    Si on souhaite obtenir non seulement le nombre de ligne mais aussi une autre colonne (un nom par exemple), et bien s'il y a pas de regroupement, la requête va retournée toutes les lignes, donc tous les noms, mais le COUNT étant le nombre de ligne, ce même nombre sera le même pour toutes les lignes.
    D'où le phénomène de répétition que tu remarque , et c'est normal.

    Mais ici, il sera impossible d'expliquer tous les cas où on peu exploiter un COUNT() tellement ils sont nombreux.
    Lla notion de regroupement (le GROUP BY) est bien souvent directement lié, et il y que la doc et faire des essais qui te permettras de mieux comprendre tout ça.

  5. #5
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 557
    Par défaut
    Merci beaucoup pour toutes vos réponses.

    J'ai réussi à le faire fonctionner de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // CALCUL NB JOURNEES
    $sql_compte_journees="SELECT * FROM $stats.calendrier WHERE score1 <> 20 AND equipe1='".$equipe."' ;";
    $journees_dom=mysql_num_rows(mysql_query($sql_compte_journees));
     
    $sql_compte_journees_="SELECT * FROM $stats.calendrier WHERE score1 <> 20 AND equipe2='".$equipe."' ;";
    $journees_ext=mysql_num_rows(mysql_query($sql_compte_journees_));
     
    $journees=$journees_ext+$journees_dom;
    Bon je me suis passer du count, parce qu'un select + mysql_num_rows suffisent, bien que j'ignore quelle est la méthode la plus optimisée.

    Sinon pour le count je me souviens avoir tenté de compter les deux champs (pour ne faire qu'une instruction mysql (avec des AND et des OR).

    Je crois que j'avais procédé de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql_compte_journees="SELECT equipe1, equipe2 COUNT (*) FROM $stats.calendrier WHERE score1 <> 20 AND (equipe1='".$equipe."' OR equipe2='".$equipe."' ) ;";
     
    (pour le php je sais plus)
    je l'ai refait comme ça sur le forum direc sans le tester, donc si il manque un ; ou quoi c'est pas grave.

    Merci pour la doc RunCodePhp, le GROUP BY je m'en étais servi je l'avais noté dans mes cours perso, ça marchait, mais je me souviens plus pourquoi ni comment ^^

    Je pense que ma requête avec count que j'ai tapé au dessus, ça deviendrait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql_compte_journees="SELECT equipe1, equipe2 COUNT (*) FROM $stats.calendrier WHERE score1 <> 20 AND (equipe1='".$equipe."' OR equipe2='".$equipe."' ) GROUP BY equipe1, equipe2 ;";
    Mais je ne sais pas si on peut regrouper sur plusieurs colonnes.

    Je vais me re-documenter là-dessus.

    Merci à tous

  6. #6
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Le problème c'est que tu n'as pas vraiment exprimé ce que tu voulais obtenir, juste dis que telle requête provoquais une erreur ou des résultats non attendus.

    Fusionner les 2 requêtes pour en faire une, et bien là, je ne vois pas.


    Par contre, faire un COUNT(*) me semble plus simple, voir plus fiable, et surtout plus optimisé.
    Quand on fait SELECT * ceci renverra toutes les valeurs de tous les champs de toutes les tables.
    Il faut voir si tu en a l'utilité ou pas.
    Si c'est juste pour avoir le nombre de lignes, alors c'est vraiment inutile (du gaspillage de mémoire).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // CALCUL NB JOURNEES
    $rs_journees = mysql_query("SELECT COUNT(*) AS total FROM $stats.calendrier WHERE score1 <> 20 AND equipe1='".$equipe."'") or die('Erreur : '.mysql_error());
    $journees_dom = mysql_fetch_array($rs_journees);
     
    $rs_journees = mysql_query("SELECT COUNT(*) AS total FROM $stats.calendrier WHERE score1 <> 20 AND equipe2='".$equipe."'") or die('Erreur : '.mysql_error());
    $journees_ext = mysql_fetch_array($rs_journees);
     
    $journees = (int)$journees_ext['total'] + (int)$journees_dom['total'];
    Personnellement je ferais ainsi.

    Les ; virgules que tu mets à la fin des requêtes ne servent à rien

  7. #7
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 557
    Par défaut
    Merci beaucoup !

    J'ai fait un copier collé de ton code en vérifiant vite fait, et ça marche du premier coup !

    Et je comprends mieux l'utilisation de l'alias sur cet exemple.

    puis si c'est plus optimisé, c'est encore mieux.

    Merci

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

Discussions similaires

  1. [Java][debutant]select count(*) ne retourne rien !!
    Par Invité dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 24/01/2007, 11h39
  2. [Oracle] select count(..) et Oracle 10G
    Par onclebob dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/09/2005, 15h04
  3. mon select count(*) marche pas
    Par zorba49 dans le forum Langage SQL
    Réponses: 14
    Dernier message: 05/08/2005, 08h28
  4. [Performance] RecordCount ou select Count(champ) ?
    Par shwin dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 28/09/2004, 17h37
  5. résultat de " select count "
    Par marie253 dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/06/2004, 12h07

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