2011-04-30 5 views
0

Je serais reconnaissant si quelqu'un pourrait m'aider avec ceci. J'ai deux tables simples et je voudrais créer une requête (pas si simple). Une de mes tables stocke les données utilisateur, l'autre stocke les messages envoyés entre utilisateurs. Comme ceux-ci:joindre et commander avec les syndicats mysql

TABLE1 
userid, username 
0, Alice 
1, Bob 
2, Tom 
3, Jerry 

TABLE2 
messageid, senderid, recipientid, message 
0, 3, 2, "Hello Tom, how are you?" 
1, 2, 3, "Hello Jerry" 
2, 2, 0, "Happy Birthday Alice, Hugs, Tom" 
3, 3, 1, "Bob, what's up there?" 

Je voudrais créer une liste de contacts d'un utilisateur donné. Je veux dire, une liste ordonnée qui inclut les noms des utilisateurs qui ont reçu des messages de l'utilisateur donné ou lui ont envoyé des messages. Donc, la liste de contacts de Tom ressemblerait à ceci:

Alice 
Jerry 

Et la liste de contacts de Bob inclurait seulement Jerry. Etc. J'ai compris que peut-être je devais utiliser deux opérations de sélection et de les unir. Par exemple:

(select senderid from TABLE2 where recipientid=2) 
union 
(select recipientid from TABLE2 where senderid=2) 

J'ai trois questions.

Comment puis-je utiliser JOIN ici pour voir les noms de TABLE1 au lieu de ceux de TABLE2?

Comment puis-je trier le résultat par les noms?

Et, est-il possible de résoudre cela d'une autre manière?

Merci.

Répondre

0

Je ne l'ai pas testé, mais cette requête devrait vous donner la liste de contacts de Tom.

SELECT DISTINCT t1.username 
    FROM table1 t1 JOIN (
     SELECT senderid AS userid, recipientid AS contactid FROM table2 
     UNION 
     SELECT recipientid as userid, senderid as contactid from table2 
    ) t2 on t1.userid = t2.contactid 
    WHERE t2.userid = 2 
    ORDER BY t1.username 
0
select userId, userName 
from 
    ((select senderid as userId from TABLE2 where recipientid=2) 
    union 
    (select recipientid as userId from TABLE2 where senderid=2) as innerView) 
join TABLE1 
where innerView.userid = TABLE1.userid 

Je suis rouillé et l'habitude d'utiliser Oracle qui a quelques différences par rapport à sql standard, mais idée devrait tenir même si ma syntaxe est un peu hors.

0

Je ne l'ai pas exécuté, mais j'espère que cela correspond à vos besoins.

SELECT T1.username AS sender, T2.Receiver AS Receiver 
FROM 
    table1 T1, 
    (SELECT table1.username AS receiver FROM table1,table2 
    WHERE table2.senderid = table1.userid AND table1.userid = t1.userid 
) AS T2 
WHERE T1.username = 'Tom';