在我的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;
}
答案 0 :(得分:7)
您可以使用联接作为您的用户表和元数据,并按列中存储的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);
以上代码用于返回声誉,如果您想要基于声誉的用户等级,您可以通过以下查询获得此信息,但我不确定您是否可以在@variables
课程中使用WPDB
的Mysql
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_concat
和find_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_max_len系统变量给出,该变量有一个 默认值为1024.虽然可以设置更高的值 返回值的有效最大长度受到约束 max_allowed_packet的值。