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 :

Plusieurs jonctions vers la même table


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 99
    Points : 74
    Points
    74
    Par défaut Plusieurs jonctions vers la même table
    Bonsoir à tous,
    Désolé pour le titre qui n'est pas très explicite, mais je n'ai pas trouvé mieux...
    Mon problème vient à mon avis d'une méconnaissance de la structure de base.
    Je vais essayer de simplifier au mieux mon problème:
    J'ai 2 tables:
    work et users
    work (id, id_author, id_worker ...)
    users (id, name ...)
    ma table work comporte 2 clefs vers la table users:
    l'utilisateur qui fait la demande de travail : id_author --> id (users)
    l'utilisateur qui réalise le travail : id_worker --> id (users)

    Pour récupérer l'ensemble des informations dont j'ai besoin je fait une requète du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM works W, users U, users V 
    WHERE W.id_author = U.id 
    AND W.id_worker = V.id
    Je parcours le résultat obtenu avec php et j'affiche un tableau.
    Je peux facilement filtrer sur le name author en ajoutant un AND U.name like '%Jean%' ou sur celui du worker avec AND V.name like '%Bernard%'.

    Mais si je veux ordonner l'astuce ne fonctionne plus et je ne peux pas classer par ordre alphabétique les workers ...

    Pour les plus courageux, voici la requête exacte faisant appel à toutes les tables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT * 
    FROM main M, works_order W, def D, users U, users V 
    WHERE M.id_work = W.id 
    AND W.id_def = D.id *
    AND M.id_author = U.id 
    AND M.id_worker = V.id 
    ORDER BY 'V.name' DESC LIMIT 0 , 40
    --> Est-ce que je passe à coté d'une astuce, ou est-ce que je dois envisager un changement radical de la construction de ma base pour pouvoir différencier facilement le name du worker avec le name du author?
    Je tiens à préciser que le * est volontaire, car je récupère plus de 80 champs avec la requète, et c'est php qui va gérer la recherche des informations à afficher.

    D'avance merci à ceux qui ont tenus jusqu'au bout, et grand merci à ceux qui pourront m'aider...

  2. #2
    ced
    ced est actuellement connecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 040
    Points : 23 795
    Points
    23 795
    Par défaut
    Bonjour,

    Dans le ORDER BY, il faut retirer les quotes ('), et de les remplacer éventuellement par le caractère ` (alt gr + 7).
    De plus, il y a une étoile (*) qui traîne dans la deuxième condition.
    Enfin, je te conseille fortement, pour y voir plus clair dans les requêtes, d'adopter l'écriture des jointures avec la syntaxe SQL2. On différencie mieux les conditions de jointures des conditions, on peut faire des jointures externes...
    Ca nous donne donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT * 
    FROM main M
    INNER JOIN works_order W ON M.id_work = W.id
    INNER JOIN def D ON W.id_def = D.id
    INNER JOIN users U ON M.id_author = U.id
    INNER JOIN users V ON M.id_worker = V.id
    ORDER BY V.`name` DESC LIMIT 0 , 40
    ced

  3. #3
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 99
    Points : 74
    Points
    74
    Par défaut
    Je viens de tester la requète, elle fonctionne nickel (certains en doutais???), il ne me reste plus qu'à intégrer les backquotes dans le code php et java et tout devrait être ok.
    Je suis soulagé de savoir que je ne dois pas repenser la structure de ma base...
    Merci à ced (Cédric???) pour cette brillante solution.

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

Discussions similaires

  1. Référence de plusieurs clés étrangères vers la même table
    Par paulisgone dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 18/03/2015, 11h39
  2. Plusieurs Champs d'une même table dans plusieurs textebox
    Par cyberbiker dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 13/09/2006, 11h32
  3. [Requête] plusieurs champs dans une même table ayants la même source
    Par Christophe93250 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 25/04/2006, 16h18
  4. Réponses: 4
    Dernier message: 14/09/2005, 16h29
  5. Réponses: 2
    Dernier message: 05/09/2005, 09h45

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