我有一个用户表
id , username
22 , max
33 , jack
44 , joe
和朋友表
id , u1 , u2 , status , reciver
为了提高阅读朋友的速度,我决定为每个友谊添加两行 所以它就像这样
id , u1 , u2 , status , reciver
1 , 22 , 33 , 1 , 22
2 , 33 , 22 , 1 , 22
3 , 22 , 44 , 1 , 22
4 , 44 , 22 , 1 , 22
5 , 22 , 55 , 1 , 22
6 , 55 , 22 , 1 , 22
现在我想让每个用户都知道并计算这两个人之间的共同朋友,比如facebook
这是我的朋友列表查询:
$profile_id = $current_user->id;
$res = $db->query("
select
u.id as firend_id,
u.username as firend_name,
f.status as firendship_status,
COUNT(f3.u2) as mutual
from friends f
JOIN users u on f.u2 = u.id
LEFT JOIN friends f2 on f.u2 = f2.u1 and f2.u2 != $profile_id
LEFT JOIN friends f3 on f3.u1 = $profile_id AND f3.u2=f2.u2
WHERE f.u1 = $profile_id
group by f2.1
");
echo 'friends list : '
foreach ($res->result() as $r ){
echo $r->firend_name;
echo $r->mutual.' friends';
}
所以我检查了对于friends.u1和的个人资料ID($ profile_id)的所有者 将friends.u2(已建立的朋友)加入users表以获取其用户名和ID
问题在于计算共同的朋友
我自己加入了朋友桌 在每个成立的朋友
在报纸上似乎没问题,但它会返回一些奇怪的结果
如果用户有3个朋友,并且没有共同的朋友,则只返回3个朋友中的一个 !
如果有共同的朋友,它会显示所有朋友,但大多数情况下共同的朋友号码是错误的
group by statement
存在问题答案 0 :(得分:1)
你不能只用2个朋友表来做,你需要第三个:
我没有测试以下内容,它适用于我的样本数据 - 只需仔细检查更大的样本:
select
u.id as firend_id,
u.username as firend_name,
f.status as firendship_status,
COUNT(f3.u2) as mutual
from friends f
JOIN users u on f.u2 = u.id
LEFT JOIN friends f2 on f.u2 = f2.u1 and f2.u2 != $profile_id
LEFT JOIN friends f3 on f3.u1 = $profile_id AND f3.u2=f2.u2
WHERE f.u1 = $profile_id
group by f.u2