2012-01-12 6 views
1

J'ai un peu de mal à trouver une instruction SQL que je dois faire.MySQL - Problème de requête complexe, plusieurs tables

J'ai 2 tables

Amis

=================================== 
friendfromid | friendtoid | request 
=================================== 

Utilisateurs

================= 
userid | username 
================= 

Je dois obtenir le nom d'utilisateur et de userid chaque utilisateur qui est mon ami.

Mon identifiant est soit dans friendfromid ou friendtoid selon que l'utilisateur ou l'utilisateur me l'a demandé. Donc, fondamentalement, ce qui doit arriver est que le script doit regarder la table des amis, obtenir toutes les lignes où mon identifiant est friendfromid ou friendtoid vérifier que le champ de requête est défini sur 1, prendre toutes les lignes qui correspondent correspondre alors obtenir les identifiants et les noms d'utilisateur de chaque friendfromid ou friendtoid qui n'est pas le mien. Par exemple, si mon id était 8 et l'id des amis était 9, disons qu'ils m'ont demandé leur id serait dans le champ friendfromid et mon id serait dans le champ friendtoid, ce qui signifie que le script prendrait leur id (9) et le faire correspondre à cet utilisateur dans la table des utilisateurs.

Répondre

2

Cela donnera liste d'amis avec id ami et ami Nom:

SELECT u.userid , u.username 
FROM Friends f 
JOIN Users u 
ON ((f.friendfromid ={the ID} AND friendtoid=u.userid) 
OR (f.friendtoid = {the ID} AND friendfromid=u.userid)) 
WHERE f.request = 1 

Put {ID} = id utilisateur dont liste d'amis nécessaire.

+0

Je pense que vous voulez dire '(friendfromid =? ET friendtoid = userid) OU (friendtoid =? ET friendfromid = userid) '. –

+0

oui.? signifie dont la liste d'amis est requise. –

+0

Ce que je veux dire c'est quand 'fromid' correspond' toid' est la clé étrangère et vice-versa. Votre condition de jointure entière est équivalente à '{ID} = userid'! –

1

devrait être quelque chose comme ceci:

SELECT * 
FROM users 
JOIN friends 
ON friendfromid != userid 
OR friendtoid != userid 
WHERE request = 1 
    AND userid = {the ID} 
+0

incorrect. Il veut obtenir l'ID de 'friendfromid' ou' friendtoid' où son identifiant est sur le champ opposé. – Raptor

1

Impossible d'atteindre dans une requête.

Pour obtenir friendtoid avec "mon ID utilisateur" dans friendfromid champ:

SELECT b.friendtoid FROM Users a, Friends b WHERE request=1 AND friendfromid = a.userid 

vice versa pour friendfromid.

+0

Désolé, cela n'a aucun sens .... Je dois obtenir l'ID utilisateur et et le nom d'utilisateur de la table des utilisateurs – BigJobbies

1

Utilisez une requête UNION, se joindre à des amis comme ci-dessous

SELECT username FROM user INNER JOIN friends ON (userid = friendfrom) WHERE friendto = {myid) AND request = 1 
UNION 
SELECT username FROM user INNER JOIN friends ON (userid = friendto) WHERE friendfrom = {myid} AND request = 1 

Rappelez-vous que vous avez besoin d'index sur les colonnes et friendto friendfrom pour la performance