加入并订购mysql工会

时间:2011-04-30 06:51:48

标签: 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?"

我想创建任何给定用户的联系人列表。我的意思是,一个有序列表,其中包括从给定用户那里获得消息或向他/她发送消息的用户的名字。所以Tom的联系人列表看起来像这样:

Alice
Jerry

Bob的联系人名单仅包括Jerry。等等。

我发现可能我必须使用两个选择操作并将它们联合起来。例如:

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

我有三个问题。

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

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

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

感谢。

3 个答案:

答案 0 :(得分:0)

我还没有测试过,但是这个查询应该会给你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

答案 1 :(得分: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有一些区别但是即使我的语法稍微偏离,想法也应该成立。

答案 2 :(得分: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';