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 :

optimisé une requete SQl avec une requete imbriqués


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 141
    Points : 39
    Points
    39
    Par défaut optimisé une requete SQl avec une requete imbriqués
    bonsoir,

    J'ai une requête récalcitrante que je n'arrive pas a optimiser

    Ici j'affiche les données de l'article via le GET (rien de méchant)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $result = mysql_query("SELECT * FROM eleve WHERE id = '$_GET[lire]' ORDER BY id DESC");
    $c=mysql_fetch_array($result);
    On sa se complique c'est ici, En effet certains résultats de la requete précédente sont des numeros je veux donc aller cherche l'intitulé dans une autre table info
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $test = mysql_query("SELECT * FROM eleve, info WHERE eleve.cat=info.id ");
    $test1 = mysql_query("SELECT * FROM eleve, info WHERE eleve.qui=info.id ");
    $test2 = mysql_query("SELECT * FROM eleve, info WHERE eleve.pays=info.id ");
    $test3 = mysql_query("SELECT * FROM eleve, info WHERE eleve.age=info.id ");
    $test4 = mysql_query("SELECT * FROM eleve, info WHERE eleve.type=info.id ");
    Et dessous j'affiche les résulats ... 5 requêtes c'est pas trés propre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $tes=mysql_fetch_array($test);
    print $tes[mod];
    $tes=mysql_fetch_array($test1);
    print $tes[mod];
    $tes=mysql_fetch_array($test2);
    print $tes[mod];
    $tes=mysql_fetch_array($test3);
    print $tes[mod];
    $tes=mysql_fetch_array($test4);
    print $tes[mod];
    S'avez vous comment optimiser ceci ?

    merci

  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
    La conception relationnelle me parait étrange mais je laisserai CinePhil en parler, c'est son dada.

    J'imagine qu'avec des OR vous pourrez vous en sortir en une simple requête, mais je ne suis pas sûr que ce soit plus performant (au passage je normalise la jointure) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT *
    FROM eleve INNER JOIN info
      ON eleve.cat=info.id
      OR eleve.qui=info.id
      OR eleve.pays=info.id
      OR eleve.age=info.id 
      OR eleve.type=info.id

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 141
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    merci de votre réponse,

    Je vais tester ceci mais par contre j'ai pas saisi comment on afficher les different résultat de cette requete ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT *
    FROM eleve INNER JOIN info
      ON eleve.cat=info.id
      OR eleve.qui=info.id
      OR eleve.pays=info.id
      OR eleve.age=info.id 
      OR eleve.type=info.id
    @+

  4. #4
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    je suppose de la même facon que tu as fait précédemment mais avec une seule requête

  5. #5
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    J'avoue qu'effectivement, j'ai du mal à saisir votre modèle de données !

    Apparemment, vous avez les tables :
    eleve(..., cat, qui, pays, age, type, ...)
    info(id, mod, ...)

    Pourquoi avoir externalisé dans la table info les données des colonnes cat, qui, pays, age et type ?

    Perso, j'aurais donné les règles de gestion suivantes :
    1) Un élève est d'une certaine catégorie et une catégorie regroupe plusieurs élèves.
    2) Un élève est né dans un certain pays et un pays a vu naître plusieurs élèves
    3) Un élève est d'un certain type et un type regroupe plusieurs élèves

    age devrait être une donnée calculée à partir d'une date de naissance et pas stockée directement en base.

    On en déduirait les fragments de MCD :
    1) Categorie -0,n----Catégoriser----1,1- Eleve
    2) Eleve -1,1----Naitre----0,n- Pays
    3) Type -0,n----Typer----1,1- Eleve

    Ce qui conduirait aux tables :
    Pays(P_Id, P_NomPays, ...)
    Categories(C_Id, C_Libelle, ...)
    Types(T_Id, T_Libelle, ...)
    Eleves(E_Id, E_IdPays, E_IdCategorie, E_IdType, E_DateNaissance, ...)

    Pour avoir toutes les infos externalisées on ferait la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT e.*, p.P_NomPays AS Pays, t.T_Libelle AS Type, c.C_Libelle AS Categorie
    FROM eleves e
    INNER JOIN pays p ON e.E_IdPays = p.P_Id
    INNER JOIN categories c ON e.E_IdCategorie = c.C_Libelle
    INNER JOIN types t ON e.E_IDType = t.T_Libelle
    Citation Envoyé par fabien14 Voir le message
    j'ai pas saisi comment on affiche les différents résultats de cette requête ?
    Ça c'est le boulot du langage de programmation, apparemment c'est du PHP, et il y a des tutoriels qui sauront très bien vous l'expliquer.

    Faut pas me tenter Waldar !

Discussions similaires

  1. probléme de requete SQl dans une base SQL Server
    Par sasuma dans le forum Développement
    Réponses: 7
    Dernier message: 09/05/2009, 17h09
  2. requete sql avec une condition dans une zone de liste
    Par khilim1 dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/12/2008, 12h00
  3. [AJAX] requete SQL avec une fonction javascript
    Par Mitsu78 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/03/2008, 21h37
  4. [SQL - Oracle 9i] Requete Sql avec filtre sur critere
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 3
    Dernier message: 05/12/2007, 08h45
  5. Requete SQL avec une clause FROM variable
    Par aCe_GiK dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 11/04/2006, 13h45

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