2011-11-12 4 views
0

J'ai une table de plusieurs à plusieurs relations que:Comment joindre deux FK d'une table à une autre table?

Tableau relationship:

relationship_id, 
first_user REFERENCES users(user_id), 
second_user REFERENCES users(user_id), 

Tableau users:

user_id, 
other user information 

Pour lire des amis d'un utilisateur donné (qui peut être dans first_user ou second_user), j'ai besoin de joindre deux tables (relationships et users), mais deux colonnes de la table relationships sont FK

Question 1: Comment puis-je joindre deux tables pour utiliser les deux FK?

J'ai une table pour les demandes en attente qui est similaire à la table relationships. En approuvant une demande, elle sera supprimée de requests et insérée dans relationships.

Question 2: Comment puis-je joindre trois tables pour récupérer la connexion et les demandes en attente dans une requête.

Répondre

2

Vous devrez donner les instances des alias de table « utilisateurs », afin que vous puissiez les consulter serparately:

SELECT u1.*, u2.* FROM relationship r 
    JOIN users u1 ON (u1.user_id = r.first_user) 
    JOIN users u2 ON (u2.user_id = r.second_user) 

Pour sélectionner deux des demandes et des relations, vous pouvez utiliser un UNION:

SELECT u1.*, u2.* FROM relationship r 
    JOIN users u1 ON (u1.user_id = r.first_user) 
    JOIN users u2 ON (u2.user_id = r.second_user) 
UNION 
SELECT u1.*, u2.* FROM requests r 
    JOIN users u1 ON (u1.user_id = r.first_user) 
    JOIN users u2 ON (u2.user_id = r.second_user) 
1

Pour utiliser les clés étrangères, vous avez besoin de deux jointures (un pour chacun):

select * 
    from relationship r 
inner join users u1 on (u1.user_id = r.first_user) 
inner join users u2 on (u2.user_id = r.second_user) 
1

La table {relationship_id, first_user, second_user} contient un groupe répétitif . Supprimez simplement l'un d'entre eux (qui rend relation_id non unique) et ajoutez une clé de substitution (ou ajoutez un ID utilisateur à la clé primaire).

CREATE TABLE relationships 
(id INTEGER NOT NULL PRIMARY KEY 
, relationship_id INTEGER NOT NULL 
, user_id INTEGER NOT NULL REFERENCES users(user_id) 
); 

Ce serait une bonne tâche pour essayer de générer des contraintes pour cette construction.

Une autre façon (pour les relations binaires comme les mariages) est de mettre le lien « significatif Autre » dans le tableau des utilisateurs:

CREATE TABLE lusers 
(luser_id INTEGER NOT NULL PRIMARY KEY 
, magnificent_other INTEGER REFERENCES lusers (luser_id) 
... 
); 

Comme un effet secondaire, cela également bigamie impossible. Encore une fois: bon travail à faire pour mettre en œuvre les contraintes.

Questions connexes