Sql Query - 选择用户既可以是朋友又可以是用户的行

时间:2010-03-08 13:09:24

标签: sql

对不起,标题不是很清楚。这是我之前提出的一个问题的后续问题,其中一位成员帮助我查询。

我有以下朋友表

朋友
friend_id - 主键
USER_ID
user_id_friend
状态

填充表的方式是 - 当我向John发送朋友请求时 - 我的userID出现在user_id中,Johns userID出现在user_id_friend中。

现在另一种情况是Mike向我发送了一个朋友请求 - 在这种情况下,mike的userID将出现在user_id中,我的userID将出现在user_id_friend中

所以要找到我所有的朋友 - 我需要运行一个查询来查找我的userID在user_id列和user_id_friend列中的显示位置

我现在要做的是 - 当我搜索用户说约翰时 - 我希望我网站上列出的所有用户Johns都会显示他们是否是我的朋友的状态,如果他们不是 - 然后显示“添加好友”按钮。

基于之前的帖子 - 我得到了这个查询,它完成了部分工作 - 我的示例user_id是1:

SELECT u.user_id, f.status
FROM user u
LEFT OUTER JOIN friend f ON f.user_id = u.user_id and f.user_id_friend = 1
where u.name like '%'

因此,这仅显示我与他们成为朋友的用户,他们已向我发送请求,即我的userID出现在user_id_friend中。
虽然我是其他人的朋友(我的userID出现在user_id列中) - 此查询将返回null

要获得那些我需要这样的另一个查询

SELECT u.user_id, f.status
FROM user u
LEFT OUTER JOIN friend f ON f.user_id_friend = u.user_id and f.user_id = 1
where u.name like '%'

那么如何将这些查询组合起来以返回1组用户以及我与他们的友谊状态。我希望我的问题很清楚

由于

3 个答案:

答案 0 :(得分:1)

你需要两次加入你的朋友表:

select u.user_id, f1.status, f2.status
from user u left outer join friend f1 on f1.user_id = u.user_id and f1.user_friend_id = 1
            left outer join friend f2 on f2.user_friend_id = u.user_id and f2.user_id = 1
where u.name like '%'

第一个状态应该显示将您作为朋友的人,第二个状态应该显示谁是您的朋友。不知道这会如何帮助你找到朋友的朋友,但是......

答案 1 :(得分:0)

组合两个查询的最简单方法是执行union:

SELECT u.user_id, f.status
FROM user u
LEFT OUTER JOIN friend f ON f.user_id = u.user_id and f.user_id_friend = 1
where u.name like '%'
UNION
SELECT u.user_id, f.status
FROM user u
LEFT OUTER JOIN friend f ON f.user_id_friend = u.user_id and f.user_id = 1
where u.name like '%'

将产生您想要的结果

答案 2 :(得分:0)

这就是我目前正在使用的 - 两个查询的联合 - 它们是用Zend框架编写的,但很容易看到sql:

$select1 = $this->select()             
        ->from(array('f'=>'friend'), array('user_id_friend as friends_id'))
                ->where('user_id='.(int)$user_id)              
        ->where('status = 1');

$select2 = $this->select()             
           ->from(array('f'=>'friend'), array('user_id as friends_id'))        
           ->where('user_id_friend='.(int)$user_id)            
           ->where('status = 1');       

$select = $this->getAdapter()->select()->union(array( '('.$select1.')', '('.$select2.')'));

$stmt = $select->query();
return $stmt->fetchAll();

希望这有帮助