我没有太多使用PHP的经验,但我已经开发了一个粗略的算法来确定社交网络上的前10名用户的关注者数量。它确实返回了一个似乎正确的用户列表,但我可以看到有两个问题:
这似乎是非常重复和资源密集型的,特别是如果我们有很多用户。如果用户没有比最后一个位置更多的关注者,同时仍然保持排序顺序,是否有一种简单的方法可以使算法短路?如何压缩/简化算法?
它并不完全有效。它返回的用户列表不是前10位用户。例如,运行脚本现在返回具有这些跟随者计数的用户(按顺序):54,7,6,4,1,3,2,2,1,1。这些数字似乎是正确的,但我知道一个事实至少有两个其他用户的关注者数量高于54.此外,第五个用户不合适。这是我们的算法的问题还是其他问题(也许我们如何存储关注者)?
以下是相关代码:
$array = array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
$result = mysql_query("SELECT * FROM users") or die(mysql_error());;
for($i = 0; $user = mysql_fetch_array($result, MYSQL_NUM); $i++) {
if (following($user[0]) > following($array[0])) $array[0] = $user[0];
else if (following($user[0]) > following($array[1])) $array[1] = $user[0];
else if (following($user[0]) > following($array[2])) $array[2] = $user[0];
else if (following($user[0]) > following($array[3])) $array[3] = $user[0];
else if (following($user[0]) > following($array[4])) $array[4] = $user[0];
else if (following($user[0]) > following($array[5])) $array[5] = $user[0];
else if (following($user[0]) > following($array[6])) $array[6] = $user[0];
else if (following($user[0]) > following($array[7])) $array[7] = $user[0];
else if (following($user[0]) > following($array[8])) $array[8] = $user[0];
else if (following($user[0]) > following($array[9])) $array[9] = $user[0];
}
在此之后,它将数组输入到MySQL表中。提前谢谢。
编辑:这是关注者功能的代码。
function followers($id){
$query = mysql_query("SELECT * FROM follow WHERE following='$id' AND follower!='$id'");
return mysql_num_rows($query);
}
答案 0 :(得分:1)
不要只是SELECT * FROM users
。尝试
select u.userId,count(*) as n
from users u,followers f
where u.userId=f.following
group by u.userId
order by count(*) desc
limit 10
字段名称是虚构的,因为我不知道您的实际表格结构(编辑:刚刚将f.userId
更改为f.following
,但是users
结构仍然未知)。
这将为您提供您想要的前10个组,并使用PHP进行迭代变得更容易。
编辑:为了详细说明,让RDBMS为您完成关系,聚合和排序工作。这是它的工作,并且表现良好。
答案 1 :(得分:1)
以下是两种可能的解决方案。取决于你的表结构。在这种情况下,我不会用PHP排序。使用SQL简单快捷。
如果关注者存储在用户表中:
SELECT * // try to avoid *
FROM `users`
ORDER BY followers DESC
LIMIT 10
如果关注者存储在另一个表格中(编辑:适应您的结构:):
SELECT u.user_id, COUNT(*) AS num_followers
FROM `users` u, `follow` f
WHERE u.user_id = f.following
GROUP BY u.user_id
ORDER BY COUNT(*) DESC
LIMIT 10
答案 2 :(得分:0)
有很多用于排序的php函数,你不必自己编写。 http://php.net/manual/de/array.sorting.php