2013-04-25 36 views
0

我有一个MySQL表:从MySQL数据库中选择朋友,然后选择他们的详细资料(也许用连接)

Friends 
-------- 
fr_id 
user_id_a 
user_id_b 
approval_status 
--------- 

其背后的基本逻辑是,如果用户#1发送好友请求,好友# 2表条目将如下所示:

------------------------------------------------ 
fr_id - user_id_a - user_id_b - approval_status 
1   1   2    no 
------------------------------------------------ 

现在只有当用户批准请求时,他们才会成为朋友。

要选择给用户#1的所有请求,我可以使用此查询:

SELECT * FROM friendship 
WHERE 
approved_status='no' 
AND 
(user_id_a = 1 OR user_id_b = 1)  

结果将是这样的:

fr_id - user_id_a - user_id_b - approval_status 
    1   1   2    no 

如何,如果当前用户是一个与user_id_a区分或user_id_b,所以我可以使用其他ID从另一个表中提取他们的信息?

与@aweis

SELECT * , 
CASE WHEN user_id_a =3 
THEN 'a' 
ELSE 'b' 
END AS UserIdColumn, 
CASE WHEN user_id_a =3 
THEN user_id_b 
ELSE user_id_a 
END AS NotCurrentUserID 
FROM fr_friendship 
WHERE approved_status = 'yes' 
AND (
user_id_a =3 
OR user_id_b =3 
) 

提供我可以选择朋友,但离开即时通讯有问题的部分谢胜利的答案是与另一个表再加入得到的朋友的用户名... 我试过,但它给我的错误..

#1054 - Unknown column 'NotCurrentUserID' in 'on clause' 



SELECT f.*, p.username AS friend, 

CASE WHEN user_id_a = 1 THEN 'a' 
ELSE 'b' 
END AS UserIdColumn, 

CASE WHEN f.user_id_a = 1 THEN f.user_id_b 
ELSE f.user_id_a 
END AS NotCurrentUserID 

FROM fr_friendship AS f 
LEFT JOIN u_profile AS p ON p.user_id_login = NotCurrentUserID 

WHERE 
f.approved_status = 'yes' 
AND 
(f.user_id_a = 1 OR f.user_id_b = 1) 

编辑:解

我设法解决这个问题.... 我希望它帮助某人:

SELECT a.friend_id, u.username 
FROM 
     (SELECT CASE WHEN user_id_a = 1 
         THEN user_id_b 
         ELSE user_id_a 
       END AS friend_id 
     FROM fr_friendship 
     WHERE approved_status = 'yes' AND (user_id_a = 1 OR user_id_b = 1) 
    ) AS a 

LEFT JOIN u_profile AS u ON u.user_id_login = a.friend_id 
+0

谁是创始人,谁是互惠者 - 还是不是那样工作? – Strawberry 2013-04-25 23:22:18

+0

thx回复@Strawberry实际上它不会那样工作。但逻辑上它的user_id_a是发起者..但是那与我的问题没有关系。 – Anmar 2013-04-25 23:30:59

回答

1

您可以使用case来确定当前用户在哪一列!在下面的代码我同时显示列中的当前用户是,我也有包含不当前用户的所有的ID的第二列:

SELECT 
*, 
case when user_id_a = 1 then 'a' 
else 'b' 
end as UserIdColumn, 
case when user_id_a = 1 then user_id_b 
else user_id_a 
end as NotCurrentUserID 
FROM friendship 
WHERE 
approved_status = 'no' 
AND 
(user_id_a = 1 OR user_id_b = 1) 

左VS内加入

考虑下面的数据结构和数据。在此示例中,用户标识1链接到用户标识2,3和4,但只有用户标识2和3具有配置文件。

create table fr_friendship 
(
    fr_id int, 
    user_id_a int, 
    user_id_b int, 
    approved_status varchar(3) 
); 

create table u_profile 
(
    user_id_login int, 
    username varchar(100) 
); 

insert into fr_friendship values (1, 1, 2, 'yes'); 
insert into fr_friendship values (2, 3, 1, 'yes'); 
insert into fr_friendship values (3, 1, 4, 'yes'); 

insert into u_profile values (2,'john doe'); 
insert into u_profile values (3, 'jane doe'); 

左加入

当使用左连接:

SELECT a.friend_id, u.username 
FROM 
     (SELECT CASE WHEN user_id_a = 1 
         THEN user_id_b 
         ELSE user_id_a 
       END AS friend_id 
     FROM fr_friendship 
     WHERE approved_status = 'yes' AND (user_id_a = 1 OR user_id_b = 1) 
    ) AS a 

LEFT JOIN u_profile AS u ON u.user_id_login = a.friend_id 

所有从“内选择”匹配是在结果集中(联接的左边部分),并匹配配置文件加入,但如果用户没有配置文件,则正确的部分包含纯空值。从上面选择的结果是:

FRIEND_ID USERNAME 
2   john doe 
3   jane doe 
4   NULL 

内连接

当使用内加入:

SELECT a.friend_id, u.username 
FROM 
     (SELECT CASE WHEN user_id_a = 1 
         THEN user_id_b 
         ELSE user_id_a 
       END AS friend_id 
     FROM fr_friendship 
     WHERE approved_status = 'yes' AND (user_id_a = 1 OR user_id_b = 1) 
    ) AS a 

INNER JOIN u_profile AS u ON u.user_id_login = a.friend_id 

结果集将仅含有来自友谊行和配置文件,其中存在匹配配置文件给用户。结果将是:

FRIEND_ID USERNAME 
2   john doe 
3   jane doe 

W3schools也有不同的连接类型的一个很好的快速示例。

+0

Thx @aweis它工作正常......但它似乎很复杂加入另一个表..? – Anmar 2013-04-25 22:58:13

+0

我试着做左加入它保持给我错误... – Anmar 2013-04-25 23:17:52

+0

很高兴看到你工作的方式来解决方案。没有关于该表的信息,所以我没有包括这一点。你为什么要加入配置文件?这表明你可以拥有没有配置文件的用户ID是否正确?在这种情况下,它是好的,否则看看内部加入 – aweis 2013-04-26 04:26:29

相关问题