简化MySQL查询

时间:2012-11-11 00:06:33

标签: mysql sql database

我有一个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"返回,因为上面的查询是正确的。

4 个答案:

答案 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

http://sqlfiddle.com/#!2/5748f/1/0

答案 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