使用MySQL查询确定朋友/朋友请求/不是朋友

时间:2013-01-19 23:46:23

标签: mysql

我有这个MySQL表:

enter image description here

让我们想象一下,我以用户1的身份登录,我正在浏览用户2的个人资料。由于我们是共同的朋友(1是2和2的朋友,1是朋友),我需要回应“朋友”。

当我浏览用户4的个人资料时,我已经请求了他们的友情,但他们还没有接受,我需要回应“请求的朋友”。

在浏览任何其他用户时,我需要回应“添加朋友”。

我可以做PHP部分,我只是不知道如何进行MySQL查询。

3 个答案:

答案 0 :(得分:2)

SELECT COUNT(*) as `count`, `user` 
FROM `friends`
WHERE 
    (`user` = 1 AND `friend` = 16) OR 
    (`user` = 16 AND `friend` = 1)

count

  • 2 =互相(你是那个人的朋友)
  • 1和user是你 - 你要求那个人的友谊
  • 1和user就是那个人 - 那个人要求你的友谊
  • 0 =您与该人之间没有联系

答案 1 :(得分:0)

select (case 
    when subquery.a > 0 and subquery.b > 0 then 'friends'
    when subquery.a > 0 then 'friend requested'
    else 'add friend' end) as "friend_string"
from (
    select
        (select count(*) from relationships where user = '$my_user_id' and friend = '$opponent_user_id') as a,
        (select count(*) from relationships where user = '$opponent_user_id' and friend = '$my_user_id') as b
) subquery

请将relationships替换为您的表名,将$ variables替换为您的。

答案 2 :(得分:0)

你期待这样的事吗? (仅适用于sql部分,而不是PHP :))

SQLFIDDLE DEMO

SELECT DISTINCT a. user, 
                CASE 
                  WHEN a.user = b.friend 
                       AND a.friend = b.user THEN b.friend 
                  ELSE '' 
                end friends, 
                CASE 
                  WHEN a.user = b.friend 
                       AND a.friend <> b.user THEN a.friend 
                  ELSE '' 
                end friendreq, 
                CASE 
                  WHEN a.user <> b.friend 
                       AND a.friend <> b.user THEN a.friend 
                  ELSE '' 
                end addfriend 
FROM   demo a 
       LEFT JOIN demo b 
              ON a.id > b.id; 
| USER | FRIENDS | FRIENDREQ | ADDFRIEND |
------------------------------------------
|    1 |         |           |           |
|    2 |       2 |           |           |
|    1 |         |           |        16 |
|    1 |         |        16 |           |
|   16 |         |           |           |
|   16 |         |           |         1 |
|   16 |      16 |           |           |
|    1 |         |           |         4 |
|    1 |         |         4 |           |