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

Requêtes MySQL Discussion :

[MySQL] Requête group by optimisable?


Sujet :

Requêtes MySQL

  1. #1
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut [MySQL] Requête group by optimisable?
    Bonjour à tous !!

    Je viens d'écrire une requête, qui fonctionne correctement (i.e, elle me renvoie bien les lignes attendues), houra !

    Mais je me demandais, par simple curiosité, si c'est la meilleure façon de faire, et sinon, comment feriez vous??

    Allez, maintenant, je présente les choses :

    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
     
    table 
    T_CAL
    ( 
    CAL_ID SMALLINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    CALTYP_ID  SMALLINT NOT NULL REFERENCES T_CAL_TYPE(CALTYP_ID), 
    RF_ID SMALLINT NULL,
    CHAIN_ID SMALLINT NULL
    );
     
     
    T_CAL_TYPE
    (
    CALTYP_ID SMALLINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    CALTYP_NAME VARCHAR(40) NOT NULL
    )
     
     
    Y'a d'autres colonnes sur ces 2 tables, mais on s'en tamponne :)
    Le but de la requête : pour chaque groupe (RF_ID, CHAIN_ID) de la table T_CAL (ainsi que pour un autre filtre dans le WHERE), je veux conserver uniquement les CAL_ID de telle sorte que ces CAL_ID ne soit pas le minimum pour ce groupe (RF_ID, CHAIN_ID) là.

    Exemple (des lignes de la table T_CAL):
    1 - 1 - 2
    2 - 1 - 1
    3 - 1 - 2
    4 - 1 - 2
    5 - 1 - 1
    Le résultat que j'attends :

    3 - 1 - 2
    4 - 1 - 2
    5 - 1 - 1
    Maintenant voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT cal1.cal_id FROM t_cal cal1
    INNER JOIN t_cal_type ty ON ty.caltyp_id = cal1.caltyp_id
    LEFT OUTER JOIN
     
    (SELECT min(cal.cal_id) as minB FROM t_cal cal
    INNER JOIN t_cal_type type1 ON type1.caltyp_id = cal.caltyp_id
    WHERE type1.CALTYP_NAME='RCHAIN'
    GROUP BY cal.rf_id, cal.chain_id) as te
     
    ON minB = cal1.cal_id
    WHERE ty.caltyp_name='RCHAIN'
    AND minB IS NULL
    Cette requête fait bien ce que j'attends, mais est ce qu'il y'a plus simple? plus optimisé? Comment auriez vous fait?

    D'avance, je vous dis bien merci ! !

    Mickaël.
    define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.

  2. #2
    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
    À première vue, et indentation du code mise à part, ça me semble pas mal du tout !
    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 !

  3. #3
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Dommage de passer par CALTYP_NAME='RCHAIN' pour filtrer plutôt que par CALTYP_ID qui est indexée.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Faut voir, une table de type est logiquement une très petite table, du coup un index sur la colonne de code ne va pas forcément être utilisé (je ne parle pas de la pk)
    Du coup la perte de temps devrait être minime (en gros 1-2 accès disque)

  5. #5
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut
    Bonjour, et merci à vous 3 !

    Effectivement, la table T_CALTYP est une "petite" table, 6~7 colonnes, avec au max 40 lignes.

    Mais, cela dit, je ne comprend pas trop :
    "Dommage de passer par CALTYP_NAME='RCHAIN' pour filtrer plutôt que par CALTYP_ID qui est indexée."
    Comment faire autrement??
    define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.

  6. #6
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Et bien j'imagine que la requête est construite, disons dynamiquement, et que tant qu'à faire si on sélectionne 'RCHAIN' dans une liste déroulante, s'arranger pour que la value associée à l'<option> soit celle de caltyp_id plutôt que celle de CALTYP_NAME.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut
    Ah ok !
    Oui effectivement, c'est envisageable
    define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.

  8. #8
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Du coup, tu optimises ta requête (et ta sous-requête) puisque tu n'as plus besoin des jointures.
    Optimiser c'était bien l'objectif visé au départ, non ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  9. #9
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut
    C'est pas faux !

    Merci pour toutes vos remarques !

    Je tag [résolu]
    define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.

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

Discussions similaires

  1. Requête delete MySQL avec group by et count(*)
    Par monlou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/09/2014, 06h17
  2. requête group by (mysql)
    Par Anandamine dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/06/2012, 14h09
  3. Réponses: 3
    Dernier message: 16/08/2006, 16h05
  4. [php-mysql] requête qui ne marche pas....
    Par sanosuke85 dans le forum Requêtes
    Réponses: 1
    Dernier message: 09/01/2006, 17h18
  5. Aide sur une requête (Group By...??)
    Par Cocolapin dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/12/2004, 10h26

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