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 :

simplification d'une requête


Sujet :

Requêtes MySQL

  1. #1
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut simplification d'une requête
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT accession, organism, seq_length, sequence 
    FROM fungi2 
    WHERE organism = 'orga1' 
    AND seq_length = (
        SELECT MAX(seq_length) 
        FROM fungi2 
        WHERE organism = 'orga1'
    )
    Y a-t-il moyen de faire plus simple, sans utiliser de sous requêtes?

    J'ai 14 organismes différents, j'effectue donc 14 fois cette requête, est-ce simplifiable?


    Merci,
    -- Jasmine --

  2. #2
    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,
    Eh bien non, je ne vois pas comment tu pourrais ici remplacer la sous-requête par une jointure.
    Par contre tu peux corréler la sous-requête pour sortir les 14 organismes d'une seule requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT f1.accession, f1.organism, f1.seq_length, f1.sequence 
    FROM fungi2 f1
    WHERE f1.seq_length = (
        SELECT MAX(f2.seq_length) 
        FROM fungi2 f2
        WHERE f1.organism = f2.organism)
    Le problème c'est que MySQL n'apprécie pas vraiment les sous-requêtes corrélées.
    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)

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    La seule façon de passer par une jointure, c'est de mettre la sous-requête dans une table temporaire (bref, de faire ça "à l'ancienne" dans MySQL).

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 145
    Points
    145
    Par défaut
    Bonjour,

    Je dois être spécialisé dans les jointures tordues ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t1.accession, t1.organism, t1.seq_length, t1.sequence
    FROM fungi2 AS t1
    LEFT JOIN fungi2 AS t2 ON t1.organism = t2.organism
    GROUP BY t1.organism
    HAVING t1.seq_length = MAX(t2.seq_length)
    (Je me suis inspiré d'une vieille discussion)

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Ouh là... C'est pas la jointure qui est tordue, là . C'est l'utilisation "plus que limite" du GROUP BY dans MySQL.
    Aucun autre SGBD n'accepterait cette syntaxe, et telle quelle, je ne la recommanderais pas .

    Un peu de lecture pour comprendre pourquoi : http://cedric-duprez.developpez.com/...fier-group-by/

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 145
    Points
    145
    Par défaut
    (Éh bien Ced, tu m'as donné de la lecture aujourd'hui)

    Pourtant sur ce coup-là, il me semble que c'est bien un "group by" qu'il faut :
    Citation Envoyé par Jasmine80 Voir le message
    J'ai 14 organismes différents, j'effectue donc 14 fois cette requête
    Cette requête ne retourne qu'un seul résultat. On va donc la faire passer intégralement pour avoir les 14 résultats.
    Et pour le plus grand "seq_length", pour chaque organisme, on doit utiliser un MAX : il faut une aggrégation GROUP BY, on ne peut pas y échapper

    Par contre, je conviens que d'autres fois, l'utilisation de Group by est plus que discutable, et alors que je tendais à faire figurer le plus de champs dans les Group by, la lecture de ton article me fait faire marche arrière (je croyais que c'était une recommandation de la norme).

  7. #7
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Merci beaucoup mais aucune de ces 2 requêtes ne fonctionne. MySQL rame et n'arrive pas à les éxécuter, il essaie pendant 5 minutes puis affiche un écran tout blanc. J'ai déjà remarqué que je dois garder des requêtes simples et pas trop lourdes où sinon elles ne fonctionnent pas. De plus, je ne sais pas ce que mo disque dur a ce matin mais bien que 95% du processeur soit inactif, il tourne et fait plein de bruit.
    -- Jasmine --

  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
    Citation Envoyé par Jasmine80 Voir le message
    De plus, je ne sais pas ce que mo disque dur a ce matin mais bien que 95% du processeur soit inactif, il tourne et fait plein de bruit.
    Une gastro ?

    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 émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Une gastro ?

    lol ... faut pas rire avec ces choses là, il va peut-être rendre l'âme.
    Je vais tout faire afin de le chouchouter, j'ai débuté doucement le traitement avec un CCleaner, ce midi il aura droit à une petite défragmentation mais je doute que cela le soigne vraiment. On verra si il passe la nuit et si il se sent mieux demain. Peut-être que je m'inquiète inutilement et que c'est simplement le service informatique qui est entrain d'exécuter un backup à distance. Quoiqu'il en soit, sa mémoire survivra car tout est bien sauvegardé. Le corps périt mais l'âme subsiste. Faut bien laisser la place aux jeunes parfois
    -- Jasmine --

  10. #10
    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
    Citation Envoyé par Jasmine80 Voir le message
    Faut bien laisser la place aux jeunes parfois
    Tu ne dis pas ça pour moi, tout de même, si ?
    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)

  11. #11
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Tu ne dis pas ça pour moi, tout de même, si ?
    faut pas être si parano La jeunesse est dans la tête non? Tant qu'on se sent jeune, on est jeune. L'inverse est également vrai, on voit parfois des personnes de 20 ayant l'air déjà complètement lassées de la vie. Mais arrêtons de philosopher, ce n'est pas un forum prévu pour cela.
    -- Jasmine --

  12. #12
    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
    Citation Envoyé par papa6 Voir le message
    ...pour le plus grand "seq_length", pour chaque organisme, on doit utiliser un MAX : il faut une aggrégation GROUP BY, on ne peut pas y échapper.
    J'ai quand même un doute sur la pertinence du MAX(t2.seq_length) que l'on va récupérer, doute que fait naître l'absence de t1.accession dans le GROUP BY.
    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)

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 145
    Points
    145
    Par défaut
    Bonsoir,

    Au temps pour moi... je viens de m'apercevoir que j'avais mal rédigé mon group by, car il faut d'une part le grouper par organisme, mais ensuite par seq_length, pour n'en garder que le maximum :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t1.accession, t1.organism, t1.seq_length, t1.sequence
    FROM fungi2 AS t1
    LEFT JOIN fungi2 AS t2 ON t1.organism = t2.organism
    GROUP BY t1.organism, t1.seq_length
    HAVING t1.seq_length = MAX(t2.seq_length)
    Quant à ton DD, il faut le bichonner, et non pas le faire travailler à fond avec une défrag ou un CCleaner.

    Quand mon disque est sur le point de lâcher, je le laisse se reposer et je travaille avec des OS sur CD comme Puppy linux qui est peu gourmand. Mais bon, faut pas être dérangé par linux

    Alors cette nouvelle proposition de requête ?

Discussions similaires

  1. Simplification d'une requête
    Par DomIII dans le forum Langage SQL
    Réponses: 19
    Dernier message: 14/09/2011, 10h23
  2. Simplification d'une requête
    Par Poulain dans le forum Requêtes
    Réponses: 5
    Dernier message: 21/09/2010, 00h25
  3. Simplification d'une requête
    Par edogawa dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/07/2010, 07h56
  4. Simplification d'une requête SQL
    Par nicou50 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 07/09/2006, 06h37
  5. Simplification d'une requête UNION
    Par eautret dans le forum Langage SQL
    Réponses: 6
    Dernier message: 18/01/2005, 14h51

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