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

SQL Procédural MySQL Discussion :

Distinct sur jointure ineficace


Sujet :

SQL Procédural MySQL

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2006
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2006
    Messages : 250
    Par défaut Distinct sur jointure ineficace
    Bonjour à tous,

    Voila j'ia une base mssql et j'effectue une requete qui s'aparente à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $query_pers ='SELECT DISTINCT(T_SAL.MATRICULE_),T_PERS.NOM_ ,T_PERS.PRENOM_ ,T_AFFEC.TITRE_ZONE_ ,T_AFFEC.TEXTE_'
            . ' FROM '.$Table_pers.' T_PERS , '.$Table_sal.' T_SAL , '.$Table_affec.' T_AFFEC'
    		. ' WHERE T_SAL.PERSONNE_ = T_PERS.PERSONNE_'
    		. ' AND T_SAL.PERSONNE_ = T_AFFEC.SALARIE_'
    		. ' AND TITRE_ZONE_ IN ("2","3");';
    La requete me retourne deux fois les memes usagés ce qui normale car ils ont chacun un titre_zone(1 et 2), cependant le terme DISTINCT ne devrait-il pas me retourner qu'un seul nom ?
    J'espere avoir été assez clair ...
    Merci pour votre soutient .

  2. #2
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Bonjour,
    Le distinct s'applique à tous les champs. Les fonctions d'agrégats peuvent répondre à votre besoin.

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2006
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2006
    Messages : 250
    Par défaut
    Je ne voit pas bien ce qu'est une focntion d'agraga pourriez vous m'en dire d'avantage en attendant je me renseigne sur le net... De mes cours je me rappel que l'agrégat sert a faire des MAX, SUM etc ...

  4. #4
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Ca va vous donner quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $query_pers ='SELECT T_SAL.MATRICULE_,T_PERS.NOM_ ,T_PERS.PRENOM_ ,max(T_AFFEC.TITRE_ZONE_)'
            . ' FROM '.$Table_pers.' T_PERS , '.$Table_sal.' T_SAL , '.$Table_affec.' T_AFFEC'
    		. ' WHERE T_SAL.PERSONNE_ = T_PERS.PERSONNE_'
    		. ' AND T_SAL.PERSONNE_ = T_AFFEC.SALARIE_'
    		. ' AND TITRE_ZONE_ IN ("2","3")'
            . ' GROUP BY T_SAL.MATRICULE_,T_PERS.NOM_ ,T_PERS.PRENOM_;';
    Vous êtes forcés de chosir quel "titre_zone" vous voulez ramener. Ici j'ai choisi le max. Pour ramener le libellé correspondant vous pouvez passer par une sous requête.

    NB: je viens de voir le critère TITRE_ZONE_ IN ("2","3") ... et vous dites que la requête ramène l'enregistrement avec la valeur "1" ?

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2006
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2006
    Messages : 250
    Par défaut
    Je vais aller plus loin dans mon explication afin qu'on soit sur la meme longueur d'onde :
    -J'ai 3 tables :

    PERSONNE
    Personne_(ID)
    Nom_
    Prenom_

    SALARIE
    Personne_(ID)
    Matricule_

    AFFECTATION
    Salarie_(ID)
    Titre_zone_
    Texte_

    Je récupere nom prenom matricule texte...
    Mon probleme dans ce cas present est le suivant :
    Pour un salarie (table AFFECTATION) j'ai titre_zone qui contient 1 et 2 comme ci contre :

    Salarie|Titre_zone_|Texte|
    BOBI | 1 | 062
    BOBI | 2 | 5002

    Texte étant variable
    J'amerai afficher ceci :
    NOM | PRENOM | MATRICULE | SITE | Centre |
    x | bobi | 12 | 062 | 5002 |

    Voila je ne sais pas si ca va vous eclairez , je ne sais pas trop comment faire (une table temp p être ) .

  6. #6
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Cela ne suffit-il pas ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select 
       Nom_ NOM,
       Prenom_ PRENOM,
       Matricule_ MATRICULE,
       AFF1.Texte SITE,
       AFF2.Texte Centre
    from
       PERSONNE, SALARIE, AFFECTATION AFF1 , AFFECTATION AFF2
    where
       PERSONNE.Personne_ = SALARIE.Personne_
       and PERSONNE.Personne_ = AFF1.Salarie_
       and PERSONNE.Personne_ = AFF2.Salarie_
       and AFF1.Titre_zone_="1"
       and AFF2.Titre_zone_="2"

  7. #7
    Membre éclairé
    Inscrit en
    Janvier 2006
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2006
    Messages : 250
    Par défaut
    En effet je pense que cela peut etre une solution que je n'avai pas envisagée toutefois : j'ai retranscrit en PHP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $query_pers ='SELECT PERS.NOM_ ,PERS.PRENOM_ , SAL.MATRICULE_ , AFC1.TEXTE_ , AFC2.TEXTE_ '
    	. ' FROM  '.$Table_pers.' PERS , '.$Table_sal.' SAL , '.$Table_affec.' AFC1, '.$Table_affec.' AFC2'
    	. ' WHERE  PERS.PERSONNE_ = SAL.PERSONNE_'
    	. ' AND PERS.PERSONNE_ = AFC1.SALARIE_ '
    	. ' AND PERS.PERSONNE_ = AFC2.SALARIE_ '
    	. ' AND AFC1.TITRE_ZONE_="2" '
    	. ' AND AFC2.TITRE_ZONE_="3";';
    Lorsque j'execute il me dit :

    Notice: Undefined index: TITRE_ZONE_ in /home/httpd/dev/badges/affichage.php on line 62

    Or TITRE_ZONE_ est connus .
    NB : Je ne savais pas que l'on pouvait utiliser deux fois la meme table en lui donnant un "login" différent.

  8. #8
    Membre éclairé
    Inscrit en
    Janvier 2006
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2006
    Messages : 250
    Par défaut
    Quelle tete de cloche !!!!
    Je me suis trompé de variable et en plus c'était même pas sur la bonne ligne, je vais essayer d'exploiter le resultat ...
    Merci pour votre précieuse aide, qui m'a en plus apporté un savoir ...

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

Discussions similaires

  1. [MYSQL] Question sur jointure
    Par LE NEINDRE dans le forum Requêtes
    Réponses: 4
    Dernier message: 17/10/2005, 11h46
  2. Select distinct sur varchar
    Par SILO dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 02/10/2005, 00h17
  3. Distinct sur un seul champ...
    Par Noodles dans le forum Langage SQL
    Réponses: 16
    Dernier message: 04/01/2005, 09h36
  4. select sur plusieurs table, question sur jointure
    Par Schulman dans le forum Langage SQL
    Réponses: 7
    Dernier message: 03/09/2004, 13h54
  5. [Débutant] DISTINCT sur une seule des colonnes ?
    Par Neilos dans le forum Langage SQL
    Réponses: 9
    Dernier message: 23/06/2004, 23h04

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