我有一个MySQL查询,我曾经用它来返回两个用户之间的共同朋友,但现在我正在重新编码我的网站,我正在尝试简化这些代码,或者至少让它变得更好。
以下是我的代码,以检查共同的朋友:
SELECT a.friendID
FROM
(SELECT CASE WHEN userID = $id
THEN userID2
ELSE userID
END AS friendID
FROM friends
WHERE (userID = $id OR userID2 = $id)
AND state='1'
) a
JOIN
(SELECT CASE WHEN userID = $session
THEN userID2
ELSE userID
END AS friendID
FROM friends
WHERE (userID = $session OR userID2 = $session)
AND state='1'
) b
ON b.friendID = a.friendID
我的表格设置如下:
userID -- userID2 -- state
1 ------- 2 ------- 1
2 ------- 3 ------- 1
1 ------- 3 ------- 0
(抱歉,我不知道如何进行漂亮的数据库结构设计,所以如果有人可以为我编辑...)
但是对于上述情况,当用户1在用户3的个人资料上时,由于用户1和用户2是朋友,而用户2和用户3是朋友,但是用户1和用户3不是,它应该是将用户2作为共同的朋友。 (状态1表示友谊被接受,状态0表示友谊未决,所以只有当状态为1才应被视为朋友)
另请注意,userID和userID2可以是任何顺序,它取决于谁作为朋友请求谁,所以像上面的查询一样,我还需要有" friendID"返回,因为上面的查询是正确的。
答案 0 :(得分:2)
SELECT t.f FROM friends JOIN (
SELECT IF(userID = $id, userID2, userID) f
FROM friends
WHERE state AND $id IN (userID, userID2)
) t ON t.f IN (userID, userID2)
WHERE state AND $session IN (userID, userID2)
在sqlfiddle上查看。
答案 1 :(得分:1)
不一定是最快但最简单的阅读:
Create View ActiveFriends As
Select
UserId, UserID2
From
friends
Where
State = '1'
Union All
Select
UserId2, UserID
From
friends
Where
State = '1'
Select
f1.userID2 as MutualFriendId
From
ActiveFriends f1
Inner Join
ActiveFriends f2
On f1.UserID2 = f2.UserID
Where
f1.UserID = $session And
f2.UserID2 = $id
答案 2 :(得分:0)
你可以这样做:
SELECT userID2
FROM friends_table
WHERE userID IN ( $id, $session )
AND state = 1
GROUP BY userID2
HAVING COUNT(userID2) >= 2
friends_table:
user_id | friend_id | state
-----------------------------
1 | 7 | 1
2 | 3 | 0
7 | 1 | 1
用户1和7是朋友,用户2希望成为用户3的朋友,但用户3尚未回复。
答案 3 :(得分:-1)
SELECT userID2
FROM friends
WHERE userID = $fromID
INTERSECT
SELECT userID2
FROM friends
WHERE userID = $theOtherID
编辑: 另一个不太明确的解决方案是
SELECT userID2
FROM friends INNER JOIN friends f2
USING (userID2)
WHERE friends.UserID = $fromID AND f2.userID = $theOtherID