gpt4 book ai didi

php - 按数字排序表并获取列表编号

转载 作者:可可西里 更新时间:2023-11-01 07:22:22 26 4
gpt4 key购买 nike

在我的 WordPress 站点中,我有一个自定义用户元数据 reputation。该值是数字,其使用方式与 Stackoverflow 此处使用积分/声誉的方式类似。

我想获取用户给其他人排名的次数。

浏览数据库,我需要做的就是按降序列出表格,我可以看到谁排名第 1(得分最多)等等......

有什么方法可以向用户显示等级编号?我猜最好的方法是按降序对表格进行排序,并以某种方式获得用户所在位置的编号在那个列表中?

我想获取用户的等级编号。类似于下面获取用户评论总数的函数。我需要 user_id 作为参数:

function get_user_comments_count( $uid ){
global $wpdb;
$where = 'WHERE comment_approved = 1 AND user_id = ' . $uid ;
$comment_count = $wpdb->get_var("SELECT COUNT( * ) AS total
FROM {$wpdb->comments}
{$where}");
return $comment_count;
}

最佳答案

您可以对用户表和元数据使用连接,并按存储在列中的元值进行排序,

SELECT u.* 
FROM `wp_users` u
JOIN `wp_usermeta` um ON(u.ID = um.`user_id`)
WHERE um.`meta_key` = 'reputation'
ORDER BY um.`meta_value` * 1 DESC

按顺序使用 * 1 是一个简单的整数转换技巧,desc 将根据用户的信誉得分列出用户,因此信誉较高的用户将首先列出,依此类推


global $wpdb;
$query=" SELECT u.*,um.`meta_value` as `rank`
FROM $wpdb->users u
JOIN $wpdb->usermeta um ON(u.ID = um.`user_id`)
WHERE um.`meta_key` = 'reputation'
ORDER BY um.`meta_value` * 1 DESC";
$results = $wpdb->get_results($query, OBJECT );

遍历你的结果

foreach($results as $r){
echo $r->rank; // rank of user
}

根据评论编辑

这是你的功能

function getReputationByUser($user_id){
if(!is_numeric($user_id)){
return false;
}
global $wpdb;
$query=" SELECT um.`meta_value` as `rank`
FROM $wpdb->usermeta um
WHERE um.`meta_key` = 'reputation'
AND um.user_id = '".$user_id."'
";
$result = $wpdb->get_row($query);
if(!empty($result)){
return $result->rank;
}
return false;
}

echo getReputationByUser(100);

上面的代码是为了返 echo 誉,如果你想要基于声誉的用户等级,你可以通过下面的查询得到这个,但我不确定你是否可以在 中使用 Mysql 的 @variables >WPDB

SELECT t1.`rank`
FROM(
SELECT
um.user_id,
@rownum:= @rownum + 1 `rank`
FROM
wp_usermeta um
CROSS JOIN (SELECT @rownum := 0) t
WHERE um.`meta_key` = 'reputation'
ORDER BY um.`meta_value` * 1 DESC
) t1
WHERE t1.user_id = 100

上面查询的函数

function getReputationByUser($user_id){
if(!is_numeric($user_id)){
return false;
}
global $wpdb;
$query=" SELECT t1.`rank`
FROM(
SELECT
um.user_id,
@rownum:= @rownum + 1 `rank`
FROM
$wpdb->usermeta um
CROSS JOIN (SELECT @rownum := 0) t
WHERE um.`meta_key` = 'reputation'
ORDER BY um.`meta_value` * 1 DESC
) t1
WHERE t1.user_id = '".$user_id."'";
$result = $wpdb->get_row($query);
if(!empty($result)){
return $result->rank;
}
return false;
}

echo getReputationByUser(100);

这是使用 group_concatfind_in_set 函数查找用户排名的另一种方法

SELECT user_id,FIND_IN_SET(
user_id,(SELECT GROUP_CONCAT( user_id ORDER BY meta_value * 1 DESC)
FROM `wp_usermeta`
WHERE meta_key ='reputation')
) AS rank
FROM wp_usermeta
WHERE meta_key ='reputation'
AND user_id = 100

function getReputationByUser($user_id){
if(!is_numeric($user_id)){
return false;
}
global $wpdb;
$query="SELECT user_id,FIND_IN_SET(
user_id,(SELECT GROUP_CONCAT( user_id ORDER BY meta_value * 1 DESC)
FROM $wpdb->usermeta
WHERE meta_key ='reputation')
) AS rank
FROM $wpdb->usermeta
WHERE meta_key ='reputation'
AND user_id = '".$user_id."'
";
$result = $wpdb->get_row($query);
if(!empty($result)){
return $result->rank;
}
return false;
}

echo getReputationByUser(100);

According to docs The result is truncated to the maximum length that is given by the group_concat_max_len system variable, which has a default value of 1024. The value can be set higher, although the effective maximum length of the return value is constrained by the value of max_allowed_packet.

关于php - 按数字排序表并获取列表编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25607010/

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