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

Langage SQL Discussion :

Factoriser le nombre de requête


Sujet :

Langage SQL

  1. #1
    Invité
    Invité(e)
    Par défaut Factoriser le nombre de requête
    Salut programmeurs programmeuses,

    Allons droit au but !

    J'utilise en PHP, une base de données MySQL, et dans l'un de mes scripts j'éxecute 5 requêtes d'affilée, une pour chaque tranche d'âge:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select count(*) from t_personne where age < 35;
    select count(*) from t_personne where age BETWEEN 35 and 50;
    select count(*) from t_personne where age BETWEEN 50 and 65;
    select count(*) from t_personne where age BETWEEN 65 and 80;
    select count(*) from t_personne where age > 80;
    Comme l'indique le titre de la discussion, y'a-t-il un moyen de lancer une seule requête pour les 5 tranches d'âge, en d'autre termes comment factoriser ?

    J'ai une idée ce à quoi pourrait ressembler la requête idéale, elle est fausse mais la voilà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select count(age) as tr1, count(age) as tr2, count(age) as tr3, count(age) as tr4, count(age) as tr5
    from t_personne
    where tr1 < 35
    and (tr2 BETWEEN 35 and 50)
    and (tr3 BETWEEN 50 and 65)
    and (tr4 BETWEEN 65 and 80)
    and tr5 > 80;
    Si ce genre de requête est possible, je pourrais alors gagner en performance.

    Je vous remercie d'avance.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Tout simplement en utilisant un CASE et un GROUP BY :
    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
      SELECT case
               when age < 35               then ' 0 <= Age < 35'
               when age >= 35 AND age < 50 then '35 <= Age < 50' 
               when age >= 50 AND age < 65 then '50 <= Age < 65'
               when age >= 65 AND age < 80 then '65 <= Age < 80'
               when age >= 80              then '80 <= Age'
               else 'Age inconnu'
             end as tranche_age,
             count(*) as nb_personnes
        FROM t_personne
    GROUP BY case
               when age < 35               then ' 0 <= Age < 35'
               when age >= 35 AND age < 50 then '35 <= Age < 50' 
               when age >= 50 AND age < 65 then '50 <= Age < 65'
               when age >= 65 AND age < 80 then '65 <= Age < 80'
               when age >= 80              then '80 <= Age'
               else 'Age inconnu'
             end;

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour votre réponse rapide.

    J'ai tapé la requête (copier/coller) mais il m'affiche une erreur de ce genre:

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'count(*) AS nb_personnes FROM t_personne GROUP BY case when age < 35 ' at line 9

    D'après mes calculs, la ligne 9 c'est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    count(*) AS nb_personnes
    J'ai essayé de remonter cette ligne un cran au dessus mais il m'affiche toujours la même erreur.

    Une idée ?

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    J'ai oublié une virgule après tranche_age, mais vous auriez pu le trouver tout seul aussi

    J'édite pour correction.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Rassurez-vous, je l'avais trouvé mais en fait je m'attendais à ce que je tombe sur un résultat d'un autre genre. Je me dit que si on peut créer un résultat à 2 colonnes et 5 lignes alors on peut créer un résultat à 5 colonnes et 2 ligne, pour me faciliter les chose dans mon script PHP.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    __________________________________________________________________________
    0 <= Age < 35 |35 <= Age < 50 |50 <= Age < 65 |65 <= Age < 80 |80 <= Age |
    __________________________________________________________________________
           416    |     4946      |     6185      |     4317      |    10    |
    __________________________________________________________________________
    Logiquement c'est possible, non ?

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Oui bien entendu, mais ce n'est pas très "relationnel", dans le sens où le jour où vous voudrez rajouter une tranche vous allez modifier la structure de vos données (changement du nombre de colonnes).

    Néanmoins :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select count(case when               age < 35 then 1 end) as nb_tr1,
           count(case when age >= 35 AND age < 50 then 1 end) as nb_tr2,
           count(case when age >= 50 AND age < 65 then 1 end) as nb_tr3,
           count(case when age >= 65 AND age < 80 then 1 end) as nb_tr4,
           count(case when age >= 80              then 1 end) as nb_tr5
      from t_personne;

  7. #7
    Invité
    Invité(e)
    Par défaut
    Je l'avoue, c'est vrai ! Mais là où j'utilise cette requête, en l'occurence mon script PHP, je peux facilement récuperer les résultats:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $ressource = mysql_query($requete_ideale);
    $resultat = mysql_fetch_array($ressource, MYSQL_ASSOC);
    foreach($resultat as $une_tranche_dage)
    {
    	echo $une_tranche_dage;
    }
    Que se soit avec la première ou la deuxième solution, si j'ai à ajouter une nouvelle tranche d'âge, dans les deux cas j'aurai à modifier ma requête.

    Bref, je vais me renseigner du coté des programmeurs PHP et ensuite je marquerai la discussion en RESOLU.

    Merci, pour les deux solutions.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/11/2006, 19h03
  2. Nombre de requêtes par table
    Par nicoaix dans le forum Requêtes
    Réponses: 12
    Dernier message: 06/07/2006, 11h50
  3. Réponses: 3
    Dernier message: 05/03/2006, 23h38
  4. IB et Nombre de requêtes par secondes
    Par lio33 dans le forum Débuter
    Réponses: 5
    Dernier message: 15/09/2005, 16h52
  5. Comment factoriser un nombre ?
    Par AsmCode dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 09/08/2005, 15h24

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