Мой вариант, но подсчитывает не оч точно, из-за критерий. Не уверен на счет производительности.
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
INNER JOIN wp_postmeta
ON (wp_posts.ID = wp_postmeta.post_id )
INNER JOIN wp_postmeta AS mt1
ON ( wp_posts.ID = mt1.post_id )
INNER JOIN wp_postmeta AS mt2
ON ( wp_posts.ID = mt2.post_id )
WHERE 1=1
AND ( wp_postmeta.meta_key = '_wpcr_rating_stars_count'
AND mt1.meta_key = '_wpcr_rating_stars_avg'
AND mt2.meta_key = 'post_views_count' )
AND wp_posts.post_type = 'book'
AND wp_posts.post_status = 'publish'
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value DESC, mt1.meta_value DESC, mt2.meta_value DESC
foreach( $pageposts as $postnum ){
$i++;
if($postnum->ID == $id){
break;
}
}
Если есть другие варианты, отпишите пожалуйста.