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

我想 get 用户排名其他人的数量。

浏览数据库,我需要做的就是按降序列出表格,我可以看到谁排名第 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;
}

最佳答案

您可以对您的用户表和元数据使用 join,并按存储在列中的 meta_value 排序,

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 誉,如果您想要基于声誉的用户排名,您可以通过以下查询获得此信息,但我不确定您是否可以在 @variables 类中使用 Mysql 的 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);

  • group_concat

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

    10-11 07:51
    查看更多