对表格进行数字排序并获取列表编号

Posted

技术标签:

【中文标题】对表格进行数字排序并获取列表编号【英文标题】:Order table numerically and get the list number 【发布时间】:2014-10-25 18:02:39 【问题描述】:

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

我想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;

【问题讨论】:

每个用户有一个键 reputation 还是每个用户可以有多个键 reputation @MKhalidJunaid 单身。只是通过 update_user_meta() 添加到用户元数据的字符串:codex.wordpress.org/Function_Reference/update_user_meta 【参考方案1】:

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

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 in order 是一个简单的整数转换技巧,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


从 cmets 编辑

这是你的功能

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);

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

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

根据 docs 结果被截断为最大长度 由 group_concat_max_len 系统变量给出,它有一个 默认值为 1024。该值可以设置得更高,尽管 返回值的有效最大长度受 max_allowed_pa​​cket 的值。

【讨论】:

@GaryWoods 在循环中查看我的更新答案,您可以获得用户的排名,即他们在$r->rank 中的声誉 这是一个很好的答案。我有最后的要求。请参阅我更新的问题。你能把它放在一个以 $user_id 作为参数的函数中吗?那么函数返回的是用户的排名? 第一个 getReputationByUser() 工作正常,它只是返回用户声誉。但是,最新的一个,基于声誉的排名,不起作用,这就是我需要的。能否请您测试一下,看看为什么它不起作用? @GaryWoods 这是我对答案的最后一次更新,请参阅答案的 group_concat 和 find_in_set 函数部分 天哪,这太棒了,非常感谢。当这个问题有资格获得一个时,我会在两天内奖励你。你不知道你刚刚为我节省了多少工作!!

以上是关于对表格进行数字排序并获取列表编号的主要内容,如果未能解决你的问题,请参考以下文章

在表格视图中显示时对数组进行排序

Word表格里自动编号如何居中

ORACLE里查询出的数值,进行计算再排序的问题

使用 JavaScript 对 HTML 表格进行排序

excel怎么排序

Swift如何按距离对表格视图进行排序