我想首先指出我还不是很擅长高级MySQL。所以请原谅我。我想要做的是创建一个朋友列表,如下图所示:
这是我的数据库结构:
朋友表:
用户表:
到目前为止,这是我的代码:
<?php $query3 = $this->db->query("SELECT * FROM friends WHERE node1id = '{$myuserid}'");
foreach($query3->result() as $row1) {
echo $row1->node1id."<br>"; } ?>
我知道这段代码在逻辑上不正确。我想要做的是拉入users表。如果relationType = friends,则在好友列表中显示该用户的名字和姓氏。我有两个变量。 $ selectedId和$ myuserid。 $ selectedId是用户正在查看的配置文件的ID。和$ myuserid是登录用户的ID。我如何逻辑地编码这种类型的功能?
答案 0 :(得分:1)
SELECT username FROM users
WHERE userid IN
(SELECT node2id FROM friends WHERE node1id = '{$myuserid}'
AND relationType = 'friends')
和
echo $row1->username
对于共同的朋友,你可以这样做
编辑:刚刚意识到这个版本的最新版本不对,现在修复(未经测试)
SELECT username FROM users
WHERE userid IN
(SELECT node2id FROM (
(SELECT node2id FROM friends WHERE relationType = 'friends' AND node1id <> '{$myuserid}' AND node1id IN
(SELECT node2id FROM friends WHERE relationType = 'friends' AND node1id = '{$myuserid}')))
WHERE node2id IN (SELECT node2id FROM friends WHERE relationType = 'friends' AND node1id = '{$myuserid}'))
这首先选择朋友,然后它选择与你自己不相等(不等于&lt;&gt;)的那些朋友的朋友。然后它只从该列表中选择与您自己的朋友ID匹配的friendID。然后,它从users表中选择这些用户的名称。
答案 1 :(得分:0)
您可以在下面的选择中进行选择:
SELECT * FROM users WHERE idusers IN (
SELECT node2id FROM friends WHERE node1id = $myUserId
)
答案 2 :(得分:0)
以下是如何获取特定用户的所有朋友($selectedid
),并确定他们的每个朋友是否是共同的朋友:
SELECT b.*,
c.myfrnd IS NOT NULL AS isMutual
FROM (
SELECT IF(node2id = '$selectedid', node1id, node2id) AS usrfrnd
FROM friends
WHERE '$selectedid' IN (node1id,node2id) AND
relationType = 'friends'
) a
JOIN users b ON a.usrfrnd = b.userid
LEFT JOIN (
SELECT IF(node2id = '$myuserid', node1id, node2id) AS myfrnd
FROM friends
WHERE '$myuserid' IN (node1id,node2id) AND
relationType = 'friends'
) c ON b.userid = c.myfrnd
ORDER BY isMutual DESC
如果朋友是共同朋友,则列isMutual
将包含1
,否则0
。node1id
相互朋友首先出现在结果集中。
您必须考虑的事情是用户可以位于node2id
或$selectedid
列中,因此为了获得一致的连接,我们使用子选择来强制参数的朋友用户ID($myuserid
和{{1}})位于同一列中。
让我知道这是如何运作的。