Php 如何在WordPress中按派生SQL列排序?

Php 如何在WordPress中按派生SQL列排序?,php,mysql,database,wordpress,database-connection,Php,Mysql,Database,Wordpress,Database Connection,在我的WordPress网站上,我对排名最高的帖子进行排序时遇到了问题 我想排序并显示得分最高的帖子(rating\u full),这些帖子也有最多的投票(rating\u count) 两者都是LongString类型 排序示例: 商业4的评级为4.5/5-3票 商业2的评级为4.5/5-1票 商业1的评级为3.5/5-2票 在感兴趣的代码领域: orderby评级是我在代码中关注的部分 ($orderby == 'rating') 代码中帖子的评分分数为“评分满”。(比例为1到5)

在我的WordPress网站上,我对排名最高的帖子进行排序时遇到了问题

我想排序并显示得分最高的帖子(
rating\u full
),这些帖子也有最多的投票(
rating\u count

两者都是LongString类型

排序示例:

商业4的评级为4.5/5-3票
商业2的评级为4.5/5-1票
商业1的评级为3.5/5-2票

在感兴趣的代码领域:

orderby评级是我在代码中关注的部分

($orderby == 'rating')
代码中帖子的评分分数为“评分满”。(比例为1到5)

代码中帖子的投票计数为“评级计数”(投票数)

两者都是LongString类型

以下是数据库结构和数据的图像:

下面是我的代码。我注意到我的排序并不总是根据满分对帖子进行排序。我不知道为什么。我没有尝试实现count DESC,因为我不确定

// Sorting
add_filter('posts_join', 'directorySortingJoin',10,2);
function directorySortingJoin($join, $query) {
global $wpdb, $aThemeOptions;
    if ($query->is_main_query() && !$query->is_admin && ((isset($_GET['dir-    search'])) || (isset($query->query_vars["ait-dir-item-category"])) ||         (isset($query->query_vars["a-dir-item-location"])))) {
    $sql = "";
    // default ordering
    $orderby = (isset($aThemeOptions->directory->defaultOrderby)) ?  $aThemeOptions->directory->defaultOrderby : 'post_date';
    // get from get parameters
    if (!empty($_GET['orderby'])) {
        $orderby = $_GET['orderby'];
    }
    if ($orderby == 'rating') {
        $sql .= " LEFT JOIN {$wpdb->postmeta} rating ON ({$wpdb->posts}.ID  = rating.post_id AND rating.meta_key IN ('rating_full'))";
    }
    if ($orderby == 'packages') {
        directorySaveUserPackagesToDb();
        $sql .= " LEFT JOIN {$wpdb->usermeta} packages ON ({$wpdb- >posts}.post_author = packages.user_id AND packages.meta_key IN    ('dir_package'))";
    }
    if (isset($aThemeOptions->directory->showFeaturedItemsFirst)) {
        $sql .= " LEFT JOIN {$wpdb->postmeta} featured ON ({$wpdb->posts}.ID = featured.post_id AND featured.meta_key IN ('dir_featured'))";
    }
    $join .= $sql;
    }
return $join;
    }
    add_filter('posts_orderby', 'directorySortingOrderby',10,2);
    function directorySortingOrderby($orderby, $query) {
global $wpdb, $aThemeOptions;
if ($query->is_main_query() && !$query->is_admin && ((isset($_GET['dir-  search'])) || (isset($query->query_vars["a-dir-item-category"])) ||     (isset($query->query_vars["a-dir-item-location"])))) {
    $sql = "";
    // default ordering
    $orderby = (isset($aThemeOptions->directory->defaultOrderby)) ?     $aThemeOptions->directory->defaultOrderby : 'post_date';
    $order = (isset($aThemeOptions->directory->defaultOrder)) ? $aThemeOptions->directory->defaultOrder : 'DESC';
    // get from get parameters
    if (!empty($_GET['orderby'])) {
        $orderby = $_GET['orderby'];
    }
    if (!empty($_GET['order'])) {
        $order = $_GET['order'];
    }
    if ($orderby == 'rating') {
        if (isset($aThemeOptions->directory->showFeaturedItemsFirst)) {
            $sql = "featured.meta_value DESC, convert(rating.meta_value, decimal) {$order}";
        } else {
            $sql = "convert(rating.meta_value, decimal) {$order}";
        }
    } else if ($orderby == 'packages') {
        if (isset($aThemeOptions->directory->showFeaturedItemsFirst)) {
            $sql = "featured.meta_value DESC, packages.meta_value   {$order}";
        } else {
            $sql = "packages.meta_value {$order}";
        }
    } else {
        if (isset($aThemeOptions->directory->showFeaturedItemsFirst)) {
            $sql = "featured.meta_value DESC, {$wpdb->posts}.{$orderby}   {$order}";
        }
    }
    $orderby = $sql;
       }
  return $orderby;
      }

我发现了问题!使用convert代替cast

$sql=“convert(rating.meta_值,十进制){$order}”

$sql=“cast(rating.meta_值为十进制(10,2)){$order}”