对不起,标题不是很清楚。这是我之前提出的一个问题的后续问题,其中一位成员帮助我查询。
我有以下朋友表
朋友
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组用户以及我与他们的友谊状态。我希望我的问题很清楚
由于
答案 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();
希望这有帮助