繁体   English   中英

SQL查询-选择用户可以同时是朋友和用户的行

[英]Sql Query - Selecting rows where user can be both friend and user

抱歉,标题不是很清楚。 这是我先前的问题的跟进,其中一个成员帮助我进行了查询。

我有以下朋友表

朋友
friend_id-主键
用户身份
user_id_friend
状态

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

现在另一种情况是说,迈克向我发送了一个好友请求-在这种情况下,迈克的userID将出现在user_id中,而我的userID将出现在user_id_friend中

因此,要找到我所有的朋友-我需要运行查询以找到我的userID在user_id列和user_id_friend列中出现的位置

我现在想做的是-当我搜索用户说约翰时-我希望显示在我网站上的所有用户约翰斯以及他们是否是我的朋友以及是否不是我的朋友的状态-然后显示一个“添加朋友”按钮。

根据上一篇文章-我得到了执行部分工作的查询-我的示例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个用户集合以及我与他们的友谊状态如何。 我希望我的问题很清楚

谢谢

您需要两次加入好友表:

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

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

合并两个查询的最简单方法是执行联合:

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个查询的并集-它们是在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();

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM