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 :

Jointure


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Jointure
    Bonjour tlm,

    Voilà j'ai un soucis avec des requêtes entre plusieurs tables. J'ai bien passé la matinée à essayer tout ce qui est possible et immaginable à partir des post de ce forum mais je m'en sort pas. J'ai 3 tables, la 1ere contient les utilisateurs, la 2eme et la 3eme ont la même structure (4 champs). Ces 2 tables contiennent des objets, une contient ceux qui les gens ont à donner et l'autre ceux que les gens cherchent. Le but est de sélectionner entre ces 2 tables l'objet qui correspond à celui qui cherche par rapport à celui qui donne. J'ai du mal à m'expliquer mais en clair ça donne:

    J'ai l'objet n° 10 à donner et je cherche le n° 120 et un autre utilisateur cherche le 120 et donne le 10 donc comme il correspond à mes besoins il faudrait que ma requête m'indique le nom de cet utilisateur à partir de la 1ere table. Chaque table contient l'id de l'utilisateur, les tables des objet contiennent l'id de l'objet. A partir de ça est-ce que qqun pourrait m'indiquer la voie à suivre pour faire ma requête correctement ?

    Merci d'avance pour votre aide.

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Essaye ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    SELECT 
       D1.idUtilisateur AS User1_Id, 
       D1.idObjet       AS User1_ObjectId,
       D2.idUtilisateur AS User2_Id, 
       D2.idObjet       AS User2_ObjectId
     
    FROM cherche C1
     
    INNER JOIN donne D1
    ON (C1.idObjet = D1.idObjet)
     
    INNER JOIN cherche C2
    ON (D1.idUtilisateur = C2.idUtilisateur)
     
    INNER JOIN donne D2
    ON ((C2.idObjet = D2.idObjet) AND (C1.idUtilisateur = D2.idUtilisateur))
    ... en admettant qu'un utilisateur ne recherche pas un objet qu'il donne (on peut écrire un requête toute simple pour vérifier ce genre d'incohérences)

    Tu peux aussi ajouter des jointures à la fin pour avoir plus de renseignements sur l'identité des 2 utilisateurs et/ou objets (et pas seulement leurs id).

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Terrible ta requête, j'ai beau la passer avec tout ce que j'ai lu aujourd'hui mais j'avoue pas trop capter. J'ai comme tables tbl_users, tbl_in, tbl_out. tbl_in c'est ce que les gens cherchent et out ce qu'ils donnent. Le champ "id" dans tbl_users est enregistré dans les deux autres tables dans le champ "id_users" et le champ qui contient le n° de l'objet c'est "num_obj". J'ose abuser de toi et te demander de me tourner ta requête avec mes noms ? Comme ça je comprendrai un peu mieux parce que là je nage de plus en plus, d'habitude je fais comme je pense mais là je me suis dit que ct l'occasion d'essayer avec ces jointures.

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    tbl_users => on ne s'en sert pas (moins on joint de tables, plus ça va vite)

    tbl_in => cherche
    tbl_out => donne


    Si tu galères, c'est parce que tu n'as pas l'habitude des jointures réflexives (portant sur la même table) et des alias de tables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    SELECT 
       D1.id_users  AS User1_Id, 
       D1.num_obj   AS User1_ObjectId,
       D2.id_users  AS User2_Id, 
       D2.num_obj   AS User2_ObjectId
     
    FROM tbl_in C1
     
    INNER JOIN tbl_out D1
    ON (C1.num_obj = D1.num_obj)
     
    INNER JOIN tbl_in C2
    ON (D1.id_users = C2.id_users)
     
    INNER JOIN tbl_out D2
    ON ((C2.num_obj = D2.num_obj) AND (C1.id_users = D2.id_users))

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Comme ça je commence à un peu mieux saisir mais je crois que je vais bientôt aller en librairie acheter le manuel mysql

    J'ai essayé avec te requête et ça à l'air de passer, juste que dans les tables j'ai mis:

    utilisateur1: donne objets n° 4, 5, 6 et cherche n° 3
    utilisateur2: donne objets n° 2, 4, 6, 8, 10 et cherche n° 1, 3, 5, 7, 9

    Donc si je suis la logique l'utilisateur1 a en rapport avec l'utilisateur2 l'objet n° 5 qu'il donne et que l'autre cherche et pourtant dans phpmyadmin j'ai aucun résultat. C'est normal docteur ?

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par dj-smoye
    Donc si je suis la logique l'utilisateur1 a en rapport avec l'utilisateur2 l'objet n° 5 qu'il donne et que l'autre cherche et pourtant dans phpmyadmin j'ai aucun résultat. C'est normal docteur ?
    Oui, c'est normal: je croyais que l'utilisateur 2 devait donner quelque chose en échange ! (l'énoncé de départ n'était pas très clair sur ce sujet...)

    - Ajoute un objet que user2 donne et que user1 recherche, pour voir si la requête précédente retourne bien la liste des échanges possibles

    - Pour obtenir le résultat que tu attends, supprime les 2 dernières jointures (du coup, plus de jointure réflexive et donc plus besoin des alias de table)

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    c'est vrai que j'ai du mal à m'expliquer et comme je vais plus souvent sur des forums pour aider que pour poser des questions ça aide pas

    En fait pour être précis il faudrait que pour l'utilisateur qui cherche et qui donne puisse afficher à partir de cett requête tout les autres utilisateurs qui ont x objets en rapport avec lui. C'est vrai que le but est de faire de l'échange donc logiquement si t'as rien a me donner y a pas de raison que je te donne

    J'ai mis comme t'as dit des n° en rapport et ça m'affiche les échanges possibles mais bien que c'est logique la requête me donne les deux possibilité d'échange pour un objet.

    User1_Id | User1_ObjectId | User2_Id | User2_ObjectId
    4 3 1 6
    1 6 4 3

    Si je regarde le résultat ça me dit que l'user_id 1 as l'objet 3 et l'user_id 4 à le 6 et inversément. C'est possible d'afficher les échanges genre si moi je suis user1_id 4 que ça me dise qu'on à les objets 3 et 6 à échanger avec l'user2_id 1 ? Qu'est-ce que c'est dur de s'expliquer par écrit quand-même

  8. #8
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par dj-smoye
    Si je regarde le résultat ça me dit que l'user_id 1 as l'objet 3 et l'user_id 4 à le 6 et inversément. C'est possible d'afficher les échanges genre si moi je suis user1_id 4 que ça me dise qu'on à les objets 3 et 6 à échanger avec l'user2_id 1 ? Qu'est-ce que c'est dur de s'expliquer par écrit quand-même
    J'ai rien compris...

    C'est normal que ça te donne 2 fois le même échange, mais inversé.

    Moi je t'ai donné la manière de faire la jointure de base, parce que c'est la partie la plus compliquée. Après, tu adaptes en fonction de ton besoin.

    Si tu veux tous les échanges possibles entre l'utilisateur 4 et les autres utilisateurs, tu ajoutes:
    Si tu veux classer les échanges par objets échangés, tu fais:
    Si tu veux faire compter les objets que quelqu'un peut t'échanger, tu fais des GROUP BY et des COUNT

    Si tu veux des infos sur la personne avec qui tu échange, tu rajoute une jointure sur la table tbl_users.


    Faut adapter en fonction du besoin. Tu vois, t'as vu? Yo, maintenant c'est un peu à toi de te débrouiller, brother!

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ouais je crois que j'ai saisi, entre temps j'ai essayé avec la clause where à la fin et ça à l'air de bien tourner. Maintenant reste à mettre des données pour essayer et les lister correctement pour voir si la requête donne le bon résultat.

    En tout cas merci beaucoup pour ton aide, c'est plus une épine que tu m'as retirée du pieds mais un clou

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

Discussions similaires

  1. Jointure qui ne renvoie pas tous les enregistrements
    Par rayonx dans le forum Langage SQL
    Réponses: 12
    Dernier message: 19/07/2024, 09h33
  2. pb jointure texture
    Par dweis dans le forum DirectX
    Réponses: 2
    Dernier message: 24/06/2003, 13h33
  3. Jointures en SQL
    Par Guizz dans le forum Langage SQL
    Réponses: 10
    Dernier message: 04/06/2003, 12h21
  4. Réponses: 14
    Dernier message: 17/03/2003, 18h31
  5. Jointures INNER et jointures classiques ???
    Par UbiK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/09/2002, 10h29

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