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

MySQL Discussion :

[SOLVED]peux t'on simplifier cette requete?


Sujet :

MySQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 155
    Par défaut [SOLVED]peux t'on simplifier cette requete?
    Bonjour, j'ai fait cette requête qui marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    SELECT 	(SELECT COUNT(*) FROM elections WHERE type='VOTE') as total,
    	    	(SELECT COUNT(*) FROM elections WHERE type='VOTE' AND vote='OUI') as voui,
    	        (SELECT COUNT(*) FROM elections WHERE type='VOTE' AND vote='NON') as vnon
    mais ca me semble bourrain de faire 3 selects, alors que logiquement un balayage devrait suffire.
    Puis-je l'améliorer? je veux récupérer les 3 totaux que je traite en php.

    merci d'avance.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Oui, vous pouvez faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    SELECT 	COUNT(*)  as total,
    	    	COUNT(CASE WHEN vote='OUI' THEN 1 END) as voui,
    	        COUNT(CASE WHEN vote='NON' THEN 1 END) as vnon
    FROM elections 
    WHERE type='VOTE'

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 155
    Par défaut
    merci!

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 624
    Billets dans le blog
    10
    Par défaut
    Autre solution équivalente à celle de aieeeuuuuu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT SUM(TT.R1) as voui, SUM(TT.R2) as vnon, SUM(TT.R1)+SUM(TT.R2) AS TOTAL        
    FROM  (SELECT CASE WHEN VOTE= 'OUI' THEN 1 END AS R1              
                 ,CASE WHEN VOTE= 'NON' THEN 1 END AS R2              
           FROM elections
           WHERE type = 'VOTE') AS TT

  5. #5
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 900
    Par défaut
    Salut aieeeuuuuu.

    Il y a quelque chose qui ne me plait pas trop dans ta requête.
    Tu fais un count (???) sur une colonne numérique.
    Le count est réservé pour compter le nombre d'occurrence (de tuple) ?

    Ne devrait-on pas plutôt faire un sum, comme ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT 	COUNT(*)  as total,
    	    	sum(CASE WHEN vote='OUI' THEN 1 ELSE 0 END) as voui,
    	        sum(CASE WHEN vote='NON' THEN 1 ELSE 0 END) as vnon
    FROM elections 
    WHERE type='VOTE'
    A moins que les deux écritures soient autorisées.
    Question performance, laquelle est la meilleure ?

    @+

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    COUNT(*) compte le nombre de lignes.
    COUNT(UneColonne) compte le nombre de lignes où UneColonne est non NULL.

    Du coup, en effet les deux sont possibles, et je doute qu'il y ait une différence de performance significative entre les deux mais ça serait à vérifier...

  7. #7
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 900
    Par défaut
    Salut aieeeuuuuu.

    Comme tu fais un "CASE WHEN VOTE= 'OUI' THEN 1 END", chaque ligne a soit la valeur 1, soit la valeur null.
    Je suppose que 'count' compte les lignes ayant la valeur 1 et non le nombre de 1.
    Si au lieu de mettre 1, on met 2, le count ne fonctionne plus.
    D'où ma remarque qu'il vaut mieux mettre sum plutôt que count.

    Sinon, je préfère ta requête qui est plus concise que celle de Escartefigue.

    P.S.: puis-je te poser des questions sur le fonctionnent de developpez en MP ?

    @+

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Je suppose que 'count' compte les lignes ayant la valeur 1 et non le nombre de 1.
    Si au lieu de mettre 1, on met 2, le count ne fonctionne plus.
    Non, dans le cas présent, COUNT compte le nombre de lignes pour lesquelles le résultat du CASE est non null. On peut donc mettre n'importe quelle valeur arbitraire, et ça fonctionnerait donc avec 2...

  9. #9
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 900
    Par défaut
    Quand je dis : Si au lieu de mettre 1, on met 2, le count ne fonctionne plus.
    Je veux dire que tu ne peux pas utiliser le count pour sommer les 2.
    Si tu as trois lignes contenant un 2, avec un count, tu trouves 3, tandis qu'avec un sum, tu trouves 6.

    Je t'ai envoyé un MP.

    @+

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

Discussions similaires

  1. HAVING interdit dans cette requete?
    Par zuzuu dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 10/08/2006, 14h41
  2. [MySQL] Simplifier une requete
    Par philippef dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 04/07/2006, 15h42
  3. Peux t on sauver des requetes "types"
    Par Sagsag dans le forum Access
    Réponses: 2
    Dernier message: 24/04/2006, 21h39
  4. AIdez moi à optimiser cette requete MySQL SVP
    Par petozak dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/09/2005, 15h16
  5. Aidez-mois pour réaliser cette requete..
    Par mobeida dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/08/2005, 15h35

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