gpt4 book ai didi

PHP函数显示从最高分到用户时间戳的排名

转载 作者:行者123 更新时间:2023-11-29 05:16:08 25 4
gpt4 key购买 nike

我真的需要帮助来创建一个函数来根据用户的最高分计算排名。我在这里看到了很多如何查询 MYSQL 的示例,但我没有足够的 PHP 知识来创建函数。

我有一张 table :

  PRIMARY
blogs_id users_id blogs_score blogs_rate_time
1 23 1872 2015-09-09 05:21:51
2 23 2146 2015-09-10 07:31:54
3 23 2146 2015-09-10 07:32:26
4 23 2852 2015-09-10 04:42:15 <-- same score but date older
5 51 1793 2015-09-11 08:15:55
6 88 2852 2015-09-11 09:33:18 <-- same score but date newer

我需要一个 PHP 函数来显示特定用户在其个人资料中的排名。例如在userID为23的用户资料页面显示“2个地方”,为id为88的用户显示“1个地方”等。

我添加了列 blogs_rate_time 以防止并列排名。

如何为此创建函数?

  function blogsRate($user_id) {

global $db;

sql ="
WHAT IS THE OPTIMIZED QUERY FOR THAT?
";
$rank_query = $db->query($sql);

HERE SUPPOSE TO BE foreach I guess?

return ?;

}

我正在使用 smarty 来显示结果:

 $smarty->assign('rank_place', $users->blogsRate($userID));

请帮我创建工作函数来解决它。我非常感谢完整的功能,而不仅仅是一个 mysql 查询或部分功能。我是新手

提前致谢!

最佳答案

您可以按 blogs_score 和 blogs_rate_time 对查询进行排序,并相应地对行编号以获得费率。我看不到您的表名,所以我将其命名为 Ranks,查询如下所示。

Set @rowNumber = 0;

Select user_id, (@rowNumber := @rowNumber + 1) As Rank From Ranks
Order By blogs_score Desc, blogs_rate_time Asc;

那么你的函数应该如下所示。

  function blogsRate($user_id) {

global $db;

sql ="Set @rowNumber = 0;
Select user_id, (@rowNumber := @rowNumber + 1) As Rank From Ranks
Order By blogs_score Desc, blogs_rate_time Asc;";

$rank_query = $db->query($sql);

while ($row = $rank_query->fetch_assoc()) {
if ($row['user_id'] == $user_id) {
return $row['Rank'];
}
}

return null; // Or something else that you can capture for not found

}

但是,这需要检索和迭代所有数据,因此在资源使用方面会非常昂贵。为了解决这个问题,我们可以在数据库中运行搜索以仅带来相关结果。为了实现这一点,首先我们将生成排名的查询放在子查询中,然后在该子查询中进行搜索,如下所示。

Set @rowNumber = 0;

Select * From (
Select user_id, (@rowNumber := @rowNumber + 1) As Rank From Ranks
Order By blogs_score Desc, blogs_rate_time Asc
) T Where user_id = $user_id Limit 1;

限制 1 只会选择第一个结果,这应该是该 user_id 的最佳排名,因为我看到一个用户可能有多个排名。为了只为每个用户获得最好的排名,我们需要添加另一个子查询,它只带来最好的分数和时间。

Select * From (
Select user_id, (@rowNumber := @rowNumber + 1) As Rank
From (
Select user_id, MAX(blogs_score) blogs_score,
MAX(blogs_rate_time) blogs_rate_time
From Ranks
Group By user_id
) G
Order By blogs_score Desc, blogs_rate_time Desc
) T Where user_id = $user_id;

你的函数应该是这样的

  function blogsRate($user_id) {

global $db;

sql ="Set @rowNumber = 0;

Select * From (
Select user_id, (@rowNumber := @rowNumber + 1) As Rank
From (
Select user_id, MAX(blogs_score) blogs_score,
MAX(blogs_rate_time) blogs_rate_time
From Ranks
Group By user_id
) G
Order By blogs_score Desc, blogs_rate_time Desc
) T Where user_id = $user_id";

$rank_query = $db->query($sql);

if ($rank_query->num_rows > 0) {
$row = $rank_query->fetch_assoc();

return $row['Rank'];
}
else return null;

}

SQL fiddle :http://sqlfiddle.com/#!9/49023/11

关于PHP函数显示从最高分到用户时间戳的排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32527502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com