我有以下表格:
members(id, name, surname, username, password)
friends(uid, friend_uid, confirmed_uid, confirmed_friend_uid)
在friends表中uid
和friend_uid
相关的members.id
,哪里uid
总是更低friend_uid
。同意成为朋友friends.confirmed
时为真,确认友谊时为真。friends.uid
friends.friend_confirmed
friends.friend_uid
用户 A 只是 B 和 C 的朋友,他们都确认了友谊。我想要一个查询,它将向 A 显示 B 和 C 的列表(所有 A 的已确认朋友)已确认的尚未与 A 成为朋友的朋友。确保如果 B 和 C 有共同的朋友,他们是列表的顶部。
由于我的 MySQL 非常生锈,我目前正在使用多个查询来执行此操作,但这一定是非常低效的,我需要在它开始影响我的网站性能之前为我创建一个查询。
我已经开始阅读 MySQL 文档,如果我有任何地方我会更新它,但是如果有人可以帮助我加快这个过程,我将不胜感激。
这是我用一些伪代码来做的:
member_id_for_A = 1;
friends_of_A = mysql_query("
SELECT m.*, f.* FROM friends f
inner join members m on m.id = f.uid
WHERE f.friend_uid = " + member_id_for_A + " AND confirmed_uid=1 AND confirmed_friend_uid=1
UNION
SELECT m.*, f.* FROM friends f
inner join members m on m.id = f.friend_uid
WHERE f.uid = " + member_id_for_A + " AND confirmed_uid=1 AND confirmed_friend_uid=1");
foreach(row : friends_of_A)
{
friend_id = get_friened_id(row, member_id_for_A);
friends_of_friend = get_friends(friend_id); // Performs a query like above friends_of_friend
result = remove_matches(friends_of_A, friends_of_friend); // Remove common friends
// Do something with results and move onto the next friend
}
我知道这是非常糟糕的代码并且效率不高,但这是一种快速的 hacky 方式,我可以获得所需的功能,直到我有时间学习更多 MySQL。希望它可以通过一个查询清楚地说明我的目标。