首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Friendfeed两次显示相同的关系

Friendfeed两次显示相同的关系
EN

Stack Overflow用户
提问于 2011-08-05 14:25:07
回答 4查看 114关注 0票数 0

我建立了一个饲料系统,ala只是为了好玩和训练,但我想出了一个有趣的问题。想象一下这个场景:

我是nr1,nr2和nr3的朋友。在我的数据库中,它也是一个用户,nr4在数据库中我不是朋友。因此,假设nr1是nr4的朋友,在这种情况下,我希望通过nr1更新我的提要,这是nr4的朋友。这是基本的,也不是很难做到的(至少要让它工作,我没有关于性能的s*)。然后,nr1是nr2的朋友,但这等同于nr2好友nr1,这是我的问题。

我的友谊数据库的工作方式是一个友谊产生两个记录。我读过,这通常是更快的方法。

友谊桌:

  • user_id
  • friend_id
  • pending
  • lastchange

用户表:

  • user_id
  • user_name

我想出了以下代码:

代码语言:javascript
运行
复制
SELECT
    u1.user_id AS friend_id,
    u1.user_name SA friend_name,
    u2.user_id AS friends_friend_id,
    u2.user_name AS friends_friend_name
FROM users AS u1
JOIN friendship AS f1
    ON u1.user_id = f1.friend_id
    && f1.user_id = {$user_id}
    && f1.friend_pending = 0
JOIN friendship AS f2
    ON u1.user_id = f2.user_id
    && f2.friend_pending = 0
JOIN users AS u2
    ON f2.friend_id = u2.user_id
WHERE TIMESTAMPDIFF(SECOND, f2.lastchange, '{$last_login}' ) < 0;

好的,这基本上是因为它得到了所有的用户,我的朋友,谁是朋友,从我上次登录。唯一的问题是,如果我是两个人的朋友,他们都会在这个查询中被选中。区别(这使得不可能使用选择不同)是;

第一次是

  • ,nr1是朋友,nr 2是朋友,
  • 是第二次,nr2是朋友,nr1是朋友。

我不想那样,每段关系我要一排。

你们知道怎么解决这个问题吗?我想出的任何解决方案都以不显示任何内容而告终:

谢谢!

第一编辑:,我刚刚想出了另一个问题,也是与这个问题有关的。在phpMyAdmin中,上面的4列生成一个正确的表。但是在php (或者更确切地说是codeigniter的查询函数)中,它只显示两列,但是添加了更多的行.我不知道谁是谁的朋友。

第二次编辑:好的,我刚刚解决了我在第一次编辑中出现的问题,我简单地用AS重命名了列。你仍然有首要的问题。

3编辑: Stevie请求一些示例数据,这是查询结果:

代码语言:javascript
运行
复制
friend_id  |  friend_name  |   friends_friend_id  |  friends_friend_name
    1             nr1                  4                   nr4
    1             nr1                  2                   nr2     
    2             nr1                  1                   nr2

如果你听我的小故事,我就会这么做。 id =1不是"me",它是另一个用户

4编辑,不幸的是,我觉得不够清楚。我最后想得到的是一个数组,其中每个元素都包含:

  • friend_id
  • friend_name
  • friends_friend_id
  • friends_friend_name

就像编辑3的样本数据,除了我以前的名字外,可能误导了你。所以我的问题是,正如你可以看到编辑3,如果我的两个朋友成为朋友,我将得到两排为一段关系。我想得到的是:

代码语言:javascript
运行
复制
friend_id  |  friend_name  |   friends_friend_id  |  friends_friend_name
    1             nr1                  2                   nr2     
    2             nr1                  1                   nr2

我希望我说得更清楚了!谢谢

EN

回答 4

Stack Overflow用户

发布于 2013-07-12 15:54:19

因此,在我看来,您的需求似乎是不完整的,因为在好友提要中,如果nr2和nr1是朋友,您想要:

  1. 看到的东西上写着“你的共同朋友nr2和nr1是彼此的朋友!”
  2. 看到的东西上写着“你的朋友nr2和nr1成了朋友!”基于谁是第一个真正接触到友谊的人。--

场景#1

您需要另一个连接检查您的朋友的朋友是否也在您的朋友中,如果是的话,返回一个名为AlsoMyFriend的布尔列。然后,如果AlsoMyFriend是1,返回一个“你的共同朋友是彼此的朋友”,否则返回一个正常的“你的朋友朋友为新朋友”。

或者,您可以使用代码来完成此操作,只需检查您朋友的朋友的ID是否在您的朋友ID数组中,并在此基础上翻转您的feed语句。

场景#2

友谊表*primary_mover*添加一列,并将该值设置为发起友谊的*user_id*。当查找朋友的朋友时,筛选*其中primary_mover = user_id*只得到一个双边关系。

作为一个简单的度量,您可以简单地添加一个过滤器来表示,在朋友的朋友ID大于我朋友的ID的情况下,只能拉朋友的朋友:

代码语言:javascript
运行
复制
SELECT
    u1.user_id AS friend_id,
    u1.user_name SA friend_name,
    u2.user_id AS friends_friend_id,
    u2.user_name AS friends_friend_name
FROM users AS u1
JOIN friendship AS f1
    ON u1.user_id = f1.friend_id
    && f1.user_id = {$user_id}
    && f1.friend_pending = 0
JOIN friendship AS f2
    ON u1.user_id = f2.user_id
    && f2.friend_pending = 0
    && f2.friend_id > f2.user_id -- pulls nr1 befriending nr2, not nr2 befriending nr1
JOIN users AS u2
    ON f2.friend_id = u2.user_id
WHERE TIMESTAMPDIFF(SECOND, f2.lastchange, '{$last_login}' ) < 0;
票数 0
EN

Stack Overflow用户

发布于 2011-08-05 14:32:18

你试过用

代码语言:javascript
运行
复制
SELECT DISTINCT
票数 -1
EN

Stack Overflow用户

发布于 2011-08-05 15:18:59

这是一个棘手的问题在你的脑海中做,但是,尝试以下几个:

代码语言:javascript
运行
复制
SELECT  --Select your user details, and your direct friends details
    u1.user_id UserId,
    u1.user_name UserName,
    u2.user_id FriendsUserId,
    u2.user_name FriendsUserName
FROM users AS u1
JOIN friendship AS f1
    ON u1.user_id = {$user_id}
    && f1.friend_pending = 0
JOIN users AS u2
    ON f1.friend_id = u2.user_id
JOIN friendship AS f2
    ON f1.friend_id = f2.userid
    && f2.friend_pending = 0
WHERE TIMESTAMPDIFF(SECOND, f2.lastchange, '{$last_login}' ) < 0;
UNION 
SELECT  --Select your user details, and your friends friends details
    u3.user_id UserId,
    u3.user_name UserName,
    u4.user_id FriendsUserId,
    u4.user_name FriendsUserName
FROM users AS u3
JOIN friendship AS f3
    ON u3.user_id = {$user_id}
    && f3.friend_pending = 0
JOIN friendship AS f4
    ON f3.friend_id = f4.user_id
    && f4.friend_pending = 0 
JOIN users AS u4
    ON f3.friend_id = u4.user_id
WHERE TIMESTAMPDIFF(SECOND, f4.lastchange, '{$last_login}' ) < 0;

假设结果和我想的一样,工会应该过滤掉这些欺骗,因为u1.user_id应该永远是你的user_id。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6957881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档