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]Simplifier une requête union


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut [MYSQL]Simplifier une requête union
    Bonjour,
    J'aimerais savoir s'il existe une écriture plus optimisée et plus lisible de la requête suivante ?
    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
    28
    29
    30
    31
    32
    33
    SELECT MAX(ind0), MAX(ind1), MAX(ind2), MAX(ind3) FROM(
    (SELECT `ind` AS 'ind0', 0 AS 'ind1', 0 AS 'ind2', 0 AS 'ind3'
      FROM `table` 
     WHERE cond1
       AND cond2 
       AND cond3=0 
     ORDER BY Field1 DESC
     LIMIT 1)
    UNION
    (SELECT 0 AS 'ind0', `ind` AS 'ind1', 0 AS 'ind2', 0 AS 'ind3'
      FROM `table` 
     WHERE cond1
       AND cond2 
       AND cond3=1 
     ORDER BY Field1 DESC
     LIMIT 1)
    UNION
    (SELECT 0 AS 'ind0', 0 AS 'ind1', `ind` AS 'ind2', 0 AS 'ind3'
      FROM `table` 
     WHERE cond1
       AND cond2 
       AND cond3=2 
     ORDER BY Field1 DESC
     LIMIT 1)
    UNION
    (SELECT 0 AS 'ind0', 0 AS 'ind1', 0 AS 'ind2', `ind` AS 'ind3'
      FROM `table` 
     WHERE cond1
       AND cond2 
       AND cond3=3 
     ORDER BY Field1 DESC
     LIMIT 1)
    ) AS temp;
    cond1 et cond2 étant redondants.

    J'ai tenté avec
    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
    CREATE TEMPORARY TABLE tmp SELECT * FROM `table` WHERE cond1 AND cond2;
    SELECT MAX(ind0), MAX(ind1), MAX(ind2), MAX(ind3) FROM(
    (SELECT `ind` AS 'ind0', 0 AS 'ind1', 0 AS 'ind2', 0 AS 'ind3'
      FROM tmp
     WHERE cond3=0
     ORDER BY Field1 DESC
     LIMIT 1)
    UNION
    (SELECT 0 AS 'ind0', `ind` AS 'ind1', 0 AS 'ind2', 0 AS 'ind3'
      FROM tmp
     WHERE cond3=1
     ORDER BY Field1 DESC
     LIMIT 1)
    UNION
    (SELECT 0 AS 'ind0', 0 AS 'ind1', `ind` AS 'ind2', 0 AS 'ind3'
      FROM tmp
     WHERE cond3=2
     ORDER BY Field1 DESC
     LIMIT 1)
    UNION
    (SELECT 0 AS 'ind0', 0 AS 'ind1', 0 AS 'ind2', `ind` AS 'ind3'
      FROM tmp
     WHERE cond3=3
     ORDER BY Field1 DESC
     LIMIT 1)
    ) AS temp;
    mais comme je tente d"utiliser plusieurs fois la table temporaire, j'ai en retour
    debug : #1137 - Can't reopen table: 'tmp'{"success":false,"error":"#1137 - Can't reopen table: 'tmp'<\/div>"}
    Il y a-t-il une alternative ?

    Merci de vos avis.

  2. #2
    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 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    Bonjour,

    C'est typiquement le genre de requêtes où un petit jeu de données test serait le bienvenu, pour nous faire gagner du temps...
    C'est sans doute faisable à coups de CASE... WHEN..., mais pas sûr que ça soit plus optimisé...
    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

  3. #3
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    En fait, comme il est facile de le constater, il y a plus de conditions communes alors qu'une seule diffère.

    L'idéal aurait été d'extraire une 1ère table temporaire et travailler dessus
    mais comme le traitement suivant utilise aussi une table temporaire ...
    Il y aurait aussi la solution de créer la 1ère TABLE puis la détruire
    mais ce serait contre productif vu le peu de données.
    La solution CASE n'apporterait rien en lisibilité (je testerais à l'occasion)
    et s'il n'y a pas d'autre alternative pour une construction en temporaire
    j'en resterais là.

    Je reste à l'écoute...

  4. #4
    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 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    Vu que MySQL reste très pauvre en fonctionnalité (pas de CTE entre autres, qui auraient été pratiques dans le cas présent), il va falloir effectivement en rester là...
    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

  5. #5
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    OK, merci.

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

Discussions similaires

  1. [SQL] Simplifier une requête SQL ?
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/04/2006, 13h50
  2. Erreur d'agrégation dans une requête UNION
    Par soso78 dans le forum Access
    Réponses: 2
    Dernier message: 05/10/2005, 00h11
  3. [Optimisation] Problème sur une requête UNION.
    Par françois62 dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/06/2005, 16h08
  4. Simplification d'une requête UNION
    Par eautret dans le forum Langage SQL
    Réponses: 6
    Dernier message: 18/01/2005, 14h51
  5. Tri d'une requête UNION
    Par MasterOfChakhaL dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/08/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