【问题标题】:Determine friends / friend requested / not friends using MySQL query使用 MySQL 查询确定好友/请求的好友/非好友
【发布时间】:2013-01-19 23:46:23
【问题描述】:

我有这个 MySQL 表:

假设我以用户 1 的身份登录,并且正在浏览用户 2 的个人资料。因为我们是共同的朋友(1 是 2 的朋友,2 是 1 的朋友),所以我需要回显“friends”。

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

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

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

【问题讨论】:

  • 也许首先向我们展示 what you have tried 以及为什么它不适合您?
  • @eggyal 我可以列出我尝试过的所有 30 个查询,但是我不确定这会有什么帮助,因为它们都没有奏效。

标签: mysql


【解决方案1】:
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 = 你和那个人之间没有联系

【讨论】:

    【解决方案2】:
    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 替换为您的表名,并将 $ 变量替换为您的。

    【讨论】:

    • 零行,真的吗?您是如何在 PHP 程序或 phpMyAdmin 中执行查询的?
    【解决方案3】:

    你期待这样的事情吗? (仅用于 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; 
    
    |用户 |朋友 |好友请求 |添加好友 | ------------------------------------------ | 1 | | | | | 2 | 2 | | | | 1 | | | 16 | | 1 | | 16 | | | 16 | | | | | 16 | | | 1 | | 16 | 16 | | | | 1 | | | 4 | | 1 | | 4 | |

    【讨论】:

    • 是的,这看起来不错,但我认为我不需要 4 列。我只需要两个:userfriend。如果返回零行,则好友请求未挂起,此人也不是好友。如果找到user,但friend 为NULL,则好友请求处于待处理状态。如果找到user 并且也找到friend (> 0),则此人是朋友。我说的对吗?
    • 另外,这会返回不正确的值。请注意,它并没有说我是 2 的朋友,而实际上我是。
    • 对不起,我误解了你的问题,并以完全不同的方式思考。我假设您希望查询是动态的,并希望查看所有级别:$ 无能为力...您,但很高兴有人让您正确。我不认为你想要计数:(
    猜你喜欢
    • 2015-06-02
    • 2017-05-18
    • 2012-07-30
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多