2012-01-12 53 views
1

我在计算出需要制作的SQL语句时遇到了一些麻烦。MySQL - 复杂的查询问题,多个表

我有2个表

朋友

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

用户

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

我需要那是我的朋友每个用户的用户名和用户名。

我的id是在friendfromid或friendtoid中,具体取决于我是否被要求用户或用户请求我。

因此,基本上需要发生的是脚本需要查看好友表,获取我的id是friendfromid或friendtoid的所有行,检查请求字段是否设置为1,获取所有适合该行的行匹配,然后获取不是我的每个friendfromid或friendtoid的ID和用户名。

例如,如果我的身份证号码是8,朋友身份证号码是9,我们假设他们要求我的身份证号码位于friendfromid字段,而我的身份证号码位于friendtoid字段中,这意味着该脚本将采用他们的ID (9)并将其与用户表中的该用户相匹配。

回答

2

这会给好友列表与好友ID和朋友的名字:

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 

认沽{标识} =用户ID朋友目录要求。

+0

我认为你的意思是'(friendfromid =?和friendtoid = userid)或(friendtoid =?和friendfromid = userid) '。 – 2012-01-12 05:27:14

+0

是的。?意味着需要其朋友列表。 – 2012-01-12 05:31:45

+0

我的意思是当'fromid'匹配'toid'是外键,反之亦然。你的整个连接条件相当于'{ID} = userid'! – 2012-01-12 05:35:30

1

应该是这样的:

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

不正确的。他想从“friendfromid”或“friendtoid”中获取ID,他的用户ID位于相反的字段中。 – Raptor 2012-01-12 04:28:15

1

不能在1个查询实现。

friendfromid领域得到friendtoid与 “我的用户ID”:

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

反之为friendfromid

+0

对不起,这没有任何意义....我需要从用户表中获取用户名和用户名 – BigJobbies 2012-01-12 05:09:20

1

使用UNION查询,为加盟为好友下面

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 

记住,你需要在friendto和friendfrom列的索引的性能