2011-04-30 68 views
0

如果有人能够帮助我,请将此事表示感谢。我有两个简单的表,我想创建一个(不是那么简单)的查询。我的一个表存储用户数据,另一个存储用户之间发送的消息。像这些:加入并与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?" 

我想创建任何给定用户的联系人列表。我的意思是,这是一个有序的列表,其中包含从给定用户获取消息或向他/她发送消息的用户名。因此,汤姆的联系人列表如下所示:

Alice 
Jerry 

而Bob的联系人列表将只包含Jerry。等等。

我想,也许我必须使用两个选择操作并将它们联合起来。例如:

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

我有三个问题。

如何在这里使用JOIN来查看TABLE1中的名称而不是TABLE2中的ID?

如何根据名称对结果进行排序?

而且,是否有可能以任何其他方式解决这个问题?

谢谢。

回答

0

我还没有测试过,但这个查询应该给你汤姆的联系人列表。

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 

我生疏,通常使用Oracle它具有标准的SQL,但这一想法的差异应该持有,即使我的语法是有点过。

0

我还没有执行它,但我希望这适合您的要求。

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';