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 :

DISTINCT et Using Temporary


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 275
    Par défaut DISTINCT et Using Temporary
    Bonjour,

    Je suis en train de faire la chasse aux "using Temporary" pour améliorer les temps de réponses de mes requêtes.

    Je suis souvent obligé d'utiliser DICTINCT dans mes SELECT pour ne pas avoir de doublons dans mes résultats.
    Je constate que MySql utilise systématiquement une table temporaire pour traiter le DISTINCT.

    Y a t-il un moyen pour que Mysql n'utilise pas de table temporaire ?

    ou Y a t-il un autre moyen d'enlever les doublons (mis à part Group By) ?

    Exemple :
    table T1 avec clé unique sur IDPROD
    table T2 avec un INDEX sur IDPROD mais il peut y avoir plusieurs fois le même IDPROD dans la table T2
    je fais ce genre de requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT T1.nom_champ, T2.nom_champ 
    FROM T1 
    INNER JOIN T2 ON T1.IDPROD=T2.IDPROD
    D'avance merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Je me poserai avant tout le question : Pourquoi ai-je des doublons ?

    Ensuite vu le cas cité, est-ce que le distinct est vraiment util dans cette requête ?


    Et pour répondre à la question, pour virer les doublons il faut utiliser un distinct.

    Le group by sert à agréger des résultats.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par saluts92 Voir le message
    Y a t-il un moyen pour que Mysql n'utilise pas de table temporaire ?
    Non, vous ne pouvez pas forcer les plans de requêtes à ce point et comme MySQL est doté d'une des plus mauvais optimiseur de tous les SGBDR....[quote]

    ou Y a t-il un autre moyen d'enlever les doublons (mis à part Group By) ?
    Group By n'est pas là pour retirer les doublons, mais pour effectuer un groupage lorsque vous avez des agrégats. Même si le traitement est similaire, ce n'est pas la même chose. La commande pour retirer les doublons est DISTINCT.

    Commencez par apprendre le SQL. Mon site web, comme monbouquin peuvent vous y aider !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT T1.nom_champ, T2.nom_champ 
    FROM T1 
    INNER JOIN T2 ON T1.IDPROD=T2.IDPROD
    Pour commencer, les champs sont à la campagne ou dans les formulaires, pas dans les tables SQL !

    Au lieu d'un truc aussi abstrait, prenons un exemple plus concret.

    Règle de gestion :
    Un projet est dirigé par une seule personne et une personne peut diriger plusieurs projets.

    MCD :prj_id
    personne -0,n----diriger----1,1- projet

    Tables :
    personne (prs_id, prs_nom, prs_prenom...)
    projet (prj_id, prj_id_chef, prj_nom...)

    Quels sont les personnes qui dirigent les projets et quels sont leurs projets ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT prs.prs_nom AS nom_chef_projet, 
    	prs.prs_prenom AS prenom_chef_projet,
    	prj.prj_nom AS nom_projet
    FROM personne prs
    INNER JOIN projet prj ON prj.prj_id_chef = prs.prs_id
    ORDER BY prs.prs_nom, prs.prs_prenom
    Il est bien normal ici d'avoir autant de fois Jean Dupont qu'il dirige de projets non ?

    Il est donc normal que votre requête retourne plusieurs fois les mêmes données pour au moins l'une des deux colonnes du SELECT puisqu'elles ne proviennent pas de la même table.

    Alors commencez par vous demander quel est votre besoin concret.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/01/2010, 16h18
  2. Erreur de compilation après modification du Uses
    Par DevelOpeR13 dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 14h23
  3. [Optimisation] index non utilisé et using temporary
    Par jp_rennes dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/10/2006, 10h05
  4. "use may clash"
    Par Jibees dans le forum Modules
    Réponses: 4
    Dernier message: 15/05/2003, 16h27
  5. Connaitre l'unitée à ajouter dans USES
    Par DelphiCool dans le forum Langage
    Réponses: 7
    Dernier message: 01/08/2002, 13h48

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