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 :

optimisation de requête pour MySQL 4.0 (donc sans sous-requêtes)


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 102
    Points : 77
    Points
    77
    Par défaut optimisation de requête pour MySQL 4.0 (donc sans sous-requêtes)
    Bonjour,

    Je développe un site hébergé avec MYSQL 4.0 (donc pas de requête imbriqué pour moi). J'ai 3 tables :

    table1(id, nom, id_table3)
    table1_copy(id, nom, id_table3)
    table3 (id, prenom)


    On peut avoir :

    TABLE1:
    -------
    1 DUPONT 8
    2 DURAND 9

    TABLE1_COPY :
    --------------
    1 DUPOND 8

    TABLE3:
    -------
    1 TOTO
    2 TITI


    Je souhaite obtenir

    RESULTAT :
    -----------
    1 TOTO DUPOND
    2 TITI DURAND

    En bref, Je souhaite obtenir tous les prenom de table3
    associé au nom de table1 et de table1_copy (uniquement dans le cas ou ils existent)

    Je tente donc d'effectuer la requete 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
     
    SELECT table3.* 
    FROM table1,table3 LEFT JOIN table1_copy(table1.id=table1_copy.id)
    WHERE 
       ( 
          (
             table1.id_table3=table3.id 
             AND table1_copy.id_table3 IS NULL
           ) 
           OR
          (
             table1_copy.id_table3=table_3.id 
             AND table1_copy.id_table3 IS NOT NULL
           )
    )
    Et ca rame (plusieur minute pour avoir le résultat) Alors que la requete ci-dessous fonctionne très bien. et ne me renvoie UNIQUEMENT les lignes associées à table1_copy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT table3.* 
    FROM table1,table3 LEFT JOIN table1_copy(table1.id=table1_copy.id)
    WHERE 
       ( 
          (
             table1.id_table3=table3.id 
             AND table1_copy.id_table3 IS NULL
           ) 
       )
    Quelqu'un connaît-il le problème ? Et surtout Quelqu'un a-t-il une solution ?

  2. #2
    Membre éclairé Avatar de cadoudal56
    Profil pro
    Inscrit en
    Février 2005
    Messages
    694
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 694
    Points : 779
    Points
    779
    Par défaut
    Hello,

    Personnellement je ne rédige pas mes requetes de la meme manière que toi...
    Donc je te proposerais d'éssayer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT table3.id, table3.prenom, table1.nom AS nom, table1_copy.nom AS alias FROM table3
    LEFT JOIN table1  ON table1.id_table3=table_3.id
    LEFT JOIN table1_copy ON table1_copy.id_table3=table_3.id
    Cependant en redigeant la requete je me rend compte de ceci :

    Table1 possede une jointure avec table3 au niveau des champs table1.id_table3 et table_3.id

    Table1_copy possede une jointure avec table3 au niveau des champs table1_copy.id_table3 et table_3.id

    Mais il n'y a pas de jointure entre table1 et table1_copy (pas de champs communs en gros)

    A un moment tu ecris :
    LEFT JOIN table1_copy(table1.id=table1_copy.id)
    En théorie (toujours) et si tu as bien construit tes tables, les ID ne peuvent jamais etre commun... Ou alors le table1_copy.id correspond a table1.id, mais dans ce cas tu aurais du appellé le champ table1_copy.id en table1_copy.id_table1 (si on suit la logique).

    Bref tout cela pour te dire, qu'il faut faire appel a Table3 car c'est la seule qui a un champ commun avec les deux autres tables, et il vaut mieux mettre des LEFT JOIN car si le champ est vide sur la table appellé, la ligne s'affichera quand meme

    Merci de nous dire si cela resoud le probleme

    @+
    cadou

  3. #3
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Accessoirement, qu'une requête avec trois tables et un left join prenne tant de temps me laisse penser que table1.id_table3 et table1_copy.id_table3 ne sont pas indexés.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 102
    Points : 77
    Points
    77
    Par défaut
    Merci pour vos réponses et pistes.. je regarde ca avant demain et je reviens vers vous.

    Pour l'index, la table1_copy contiendra rarement plus de 50 enregistrement (c'est temporaire).. donc bon.. mais je vais regarder cela tout de même.

    Merci

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 102
    Points : 77
    Points
    77
    Par défaut
    Salut,

    Je rencontre les même problèmes avec, la méthode que me propose cadoudal56.
    Du coup, j'ai changé complètement le fonctionnement du site. Maintenant, tout fonctionne nickel (ya plus qu'une seule jointure)
    Je pense qu'effectivement la conception de ma base était a revoir.

    Merci pour vos conseils avisés

    ++

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

Discussions similaires

  1. un SUM + sous-requête pour remplacer une boucle itérative
    Par forzaxelah dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/03/2009, 22h16
  2. [MySQL] Modification d'une classe requêtant pour MySQL
    Par gimpycpu dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 06/03/2008, 00h16
  3. Pb de sous-requête pour une mise à jour
    Par Balthos dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 05/03/2008, 09h13
  4. modifier une requête pour mysql 4.0.18
    Par lina01 dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/11/2006, 11h38
  5. EDBEngineError sur une requête pour MySQL
    Par Slyteck dans le forum Bases de données
    Réponses: 4
    Dernier message: 10/08/2006, 14h17

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