我建立了一个饲料系统,ala只是为了好玩和训练,但我想出了一个有趣的问题。想象一下这个场景:
我是nr1,nr2和nr3的朋友。在我的数据库中,它也是一个用户,nr4在数据库中我不是朋友。因此,假设nr1是nr4的朋友,在这种情况下,我希望通过nr1更新我的提要,这是nr4的朋友。这是基本的,也不是很难做到的(至少要让它工作,我没有关于性能的s*)。然后,nr1是nr2的朋友,但这等同于nr2好友nr1,这是我的问题。
我的友谊数据库的工作方式是一个友谊产生两个记录。我读过,这通常是更快的方法。
友谊桌:
用户表:
我想出了以下代码:
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;
好的,这基本上是因为它得到了所有的用户,我的朋友,谁是朋友,从我上次登录。唯一的问题是,如果我是两个人的朋友,他们都会在这个查询中被选中。区别(这使得不可能使用选择不同)是;
第一次是
我不想那样,每段关系我要一排。
你们知道怎么解决这个问题吗?我想出的任何解决方案都以不显示任何内容而告终:
谢谢!
第一编辑:,我刚刚想出了另一个问题,也是与这个问题有关的。在phpMyAdmin中,上面的4列生成一个正确的表。但是在php (或者更确切地说是codeigniter的查询函数)中,它只显示两列,但是添加了更多的行.我不知道谁是谁的朋友。
第二次编辑:好的,我刚刚解决了我在第一次编辑中出现的问题,我简单地用AS重命名了列。你仍然有首要的问题。
3编辑: Stevie请求一些示例数据,这是查询结果:
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编辑,不幸的是,我觉得不够清楚。我最后想得到的是一个数组,其中每个元素都包含:
就像编辑3的样本数据,除了我以前的名字外,可能误导了你。所以我的问题是,正如你可以看到编辑3,如果我的两个朋友成为朋友,我将得到两排为一段关系。我想得到的是:
friend_id | friend_name | friends_friend_id | friends_friend_name
1 nr1 2 nr2
2 nr1 1 nr2
我希望我说得更清楚了!谢谢
发布于 2013-07-12 15:54:19
因此,在我看来,您的需求似乎是不完整的,因为在好友提要中,如果nr2和nr1是朋友,您想要:
场景#1
您需要另一个连接检查您的朋友的朋友是否也在您的朋友中,如果是的话,返回一个名为AlsoMyFriend的布尔列。然后,如果AlsoMyFriend是1,返回一个“你的共同朋友是彼此的朋友”,否则返回一个正常的“你的朋友朋友为新朋友”。
或者,您可以使用代码来完成此操作,只需检查您朋友的朋友的ID是否在您的朋友ID数组中,并在此基础上翻转您的feed语句。
场景#2
向友谊表*primary_mover*添加一列,并将该值设置为发起友谊的*user_id*。当查找朋友的朋友时,筛选*其中primary_mover = user_id*只得到一个双边关系。
作为一个简单的度量,您可以简单地添加一个过滤器来表示,在朋友的朋友ID大于我朋友的ID的情况下,只能拉朋友的朋友:
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;
发布于 2011-08-05 14:32:18
你试过用
SELECT DISTINCT
发布于 2011-08-05 15:18:59
这是一个棘手的问题在你的脑海中做,但是,尝试以下几个:
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。
https://stackoverflow.com/questions/6957881
复制相似问题