Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/11/2011, 09h08   #1
Invité de passage
 
Inscription : janvier 2007
Messages : 20
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 20
Points : 1
Points : 1
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 :
1
2
3
SELECT DISTINCT T1.nom_champ, T2.nom_champ 
FROM T1 
INNER JOIN T2 ON T1.IDPROD=T2.IDPROD
D'avance merci
saluts92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 09h12   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 643
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 643
Points : 2 639
Points : 2 639
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.
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 11h47   #3
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
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]

Citation:
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 12h16   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Citation:
Code :
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h26.


 
 
 
 
Partenaires

Hébergement Web