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 d'une requête


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Novembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2006
    Messages : 15
    Points : 8
    Points
    8
    Par défaut Optimisation d'une requête
    Bonjour,

    J'ai une 30aines de catégories stockées dans une table.
    Je souhaite les afficher toutes saufs quelques exceptions.

    Pour trouver uniquement les identifiants des catégories qui m'intéresse, il faut que j'aille chercher dans une autre table ("articles") les differentes valeur que prend le champs "categorie" pour les articles dont le type est égale à 2 (WHERE type=2)

    Je ne suis pas expert en utilisation de BDD.

    J'aurais donc procédé de la manière suivante :

    - Première requete pour sélectionner les ID concernés dans la table articles (WHERE type=2)
    - les mettre dans un array
    - Deuxième requete pour récupérer la liste des catégories
    - afficher uniquement celles trouvées dans l'array précedemment créé


    Etant donné que la table "aricles" comporte plus de 3000 entrées, je suppose qu'il y a moyen de faire quelquechose de plus performant que ce que je propose (en 1 seule requete ?)


    Merci d'avance !

  2. #2
    jnore
    Invité(e)
    Par défaut
    tu pourrais déjà pour aller plus vite, poster dans le forum sql.

    Sinon cela devrait donner quelquechose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    select indentifiant
    from ta_table
    where categorie in 
    	(
    	select categorie
    	from table_article
    	where categorie=2
    	group by categorie
    	)

    Pour être plus précis, il faudrait nous donner les champs et noms de tes tables.

  3. #3
    Futur Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Novembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2006
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    merci beaucoup pour ta réponse.

    Désolé pour le problème de localisation de mon message, je suis un peu paumé sur ce gros forum ^^

    Je vais essayer de voir ce que tu me mets. le "in" et le "group by", sont des choses que je n'ai jamais utilisées.
    Group by je suppose que c'est pour éviter les doublons ?

    Strcuture :

    Table "articles"
    id
    type
    categorie > ici j'ai l'ID qui fait la liaison avec la table categorie.
    ...

    Table "categories"
    id
    nom
    ...

    Ce que je veux donc c'est lister les noms des catégories qui figurent dans la table "articles" mais seulement celles des articles dont le type=2


    Désolé pour la formulation peu claire de mon problème, mais avec ce que tu me donne je devrais m'en sortir !

    encore merci


    EDIT
    requete focntionnelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete_select_categories = mysql_query('SELECT id, nom FROM categories WHERE id IN (SELECT categorie FROM articles WHERE type=0 GROUP BY categorie)')or exit(...);
    Sachant qu'il y a 3000 entrées dans la table article, ça ne demande pas trop de ressources ? (cette requete sera exécuté plusieurs centaines de fois par jours)

  4. #4
    jnore
    Invité(e)
    Par défaut
    3000 lignes ça n'est rien, t'inquiète !

  5. #5
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Les sous requettes sont plus longues à exécuter que des requettes normales, je te conseille donc d'utiliser le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT t1.nom FROM categorie t1, article t2
    WHERE t2.type = 2
    AND t2.categorie = t1.id
    Normalement ça devrait faire ce que tu souhaites.
    "Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."

  6. #6
    Futur Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Novembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2006
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Merci nounetmasque.

    On peut donc travailler avec ton code sur 2 tables simultanément ?
    Outre le gain de performance, quelles différences ?

    Merci beaucoup à vous deux, pour l'instant j'étais vraiment resté sur des trucs assez basiques... de nouvelle portes s'ouvrent je crois que je vais progresser d'un coup là ^^

  7. #7
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Citation Envoyé par Graph-Site Voir le message
    On peut donc travailler avec ton code sur 2 tables simultanément ?
    Outre le gain de performance, quelles différences ?
    Tu peux travailler sur autant de tables que tu le souhaites, par contre il te faut à tout prix faire une jointure entre tes tables sans quoi tu obtiendras un résultat faux.
    Exemple tu disopses de trois tables t1(50 lignes) t2(10 lignes) et t3(100 lignes), si tu lies seulement t1 et t2 alors que dans ton select tu utilises les trois tables, la requette ressortira 1000 lignes alors que tu ne devrais en obtenir 10 lignes.
    Pour chaque résultat entre t1 et t2, tu lieras les 100 lignes de t3.

    Je ne sais pas si j'ai été très clair
    "Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."

  8. #8
    Futur Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Novembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2006
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Oui je pense voir ce que tu veux dire.

    La jointure dans notre cas ce serait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND t2.categorie = t1.id
    ?

  9. #9
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Tu as tout compris
    "Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."

  10. #10
    Futur Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Novembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2006
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    youpi

    merci beaucoup en tout cas
    sans votre aide j'aurais perdu pas mal de temps en tests infructueux et à chercher de la doc pertinente...

  11. #11
    Futur Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Novembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2006
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Pour info, voici mes 2 requêtes (équivalentes, sauf erreur) avec les 2 méthodes que vous m'avez données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mysql_query('SELECT t1.nom, t1.id FROM categories t1, articles t2 WHERE t2.type=0 AND t2.categorie = t1.id GROUP BY t2.categorie ORDER BY t1.nom');
     
    mysql_query('SELECT id, nom FROM categories WHERE id IN (SELECT categorie FROM articles WHERE type=0 GROUP BY categorie) ORDER BY nom');
    J'ai fait des tests. La seconde (avec une sous requete) serait environ 3 fois plus lente que l'autre...


    Encore une fois, merci !

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

Discussions similaires

  1. Optimisation d'une requête
    Par Louis-Guillaume Morand dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 20/12/2005, 18h21
  2. Optimisation d'une requête d'insertion
    Par fdraven dans le forum Oracle
    Réponses: 15
    Dernier message: 01/12/2005, 14h00
  3. Optimisation d'une requête patchwork
    Par ARRG dans le forum Langage SQL
    Réponses: 1
    Dernier message: 11/09/2005, 15h23
  4. optimisation d'une requête avec jointure
    Par champijulie dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/07/2005, 09h45
  5. [DB2] Optimisation d'une requête
    Par ahoyeau dans le forum DB2
    Réponses: 7
    Dernier message: 11/03/2005, 17h54

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