2012-06-06 1 views
0

Je suis un débutant dans les requêtes et je suis aux prises avec l'un d'entre eux. Voici les deux tables impliquées:Joignez-vous à une relation cyclique (débutant)

UserAndAddFriends

La table askstobefriends permet à un utilisateur d'ajouter un ami dans l'application que je suis développer. La forme relationnelle de celui-ci est:

AskToBeFriends (ID (long), #UserAsker (long), #UserAsked (long), Accept (tinyint))

Donc, avec ce tableau, nous pouvons voir qui a demandé à être ami et s'il était accepté ...

La requête que j'essaie de réaliser permettrait de lister tous les amis de l'utilisateur de son ID et de renvoyer aussi le statut d'amitié (accepter le champ ==> attendre une réponse, accepté ou refusé).

Speretaly, ce serait quelque chose comme ça:

SELECT Accept, UserAsker, UserAsked 
FROM askstobefriends   
WHERE UserAsker = '".$userID."' OR UserAsked = '".$userID."' "; 

==> premier numéro: il peut être soit l'utilisateur qui a demandé à être ami avec quelqu'un ou opposit, que pourquoi je l'ai mis et OU. Après cela, je serais comme ça everyfriend fondé il y a ces informations:

SELECT colUserID, colUserLogin, colUserName, colUserFirstname 
FROM userTable 
WHERE colUserID == FRIEND 

donc je suppose que je dois faire une requête de jointure, et dans mon joindre, je dois être sûr que j'utilise le droit clé étrangère de la table asktobefriends pour chaque cas !! (Une fois que la clé pourrait être UserAsked et une autre fois UserAsker en fonction de qui a demandé à être amis: S)

Quelqu'un at-il une idée s'il vous plaît: S ?? Merci ;-) !!

+0

Merci, je ne savais pas comment faire: p Je pensais que je devais juste répondre "était ce post utile?" – Karly

Répondre

1

Votre conception est incorrecte. Un utilisateur demande à être ami d'un autre utilisateur, donc "Ask_to_be_friend" est la relation, et la cardinalité est de plusieurs à plusieurs, donc le design ressemblera à ceci:

User_User_ID est UserAsker.

User_USer_ID1 est UserAskedtobefriend

enter image description here

et la requête pourrait être comme (vous obtiendrez tous les utilisateurs qui user_user_ID demande à être ami):

Select U.* from User as U 
Join Ask_to_be_friend as A on 
U.user_ID = A.User_user_ID 
--where a.accept=1 if you add this, this will give 
--you all the friends ID of the user_ID table User 

Si vous voulez obtenir les noms ou des informations supplémentaires de l'asktobefriend vous aurez besoin d'un supplément Joindre

Select U.* from User as U 
Join Ask_to_be_friend as A on 
U.user_ID = A.User_user_ID 
Join User as U2 on 
A.User_User_ID1=u2.User_ID 
--where a.accept=1 ,with this you'll with get only the friends 
1

Vous pouvez join les tables en utilisant des critères qui garantissent que seuls les amis de :userID sont renvoyés. Par exemple:

SELECT u.*, a.Accept 
FROM askstobefriends a JOIN userTable u ON (:userID, u.colUserID) IN (
     (a.UserAsker, a.UserAsked), 
     (a.UserAsked, a.UserAsker) 
     ) 
+0

Donc: userID est une variable? en php ce serait $ userID? ou est le: userID, l'ID de l'ami? – Karly

+0

@Karly: Dans ce cas, ': userID' est l'identifiant de PHP. Je mets ':' au lieu de '$' car les [instructions préparées] (http://stackoverflow.com/a/60496/623041) sont * tellement * plus belles! ;) – eggyal