在SQL请求中按meta_value排序

时间:2019-04-25 05:42:37

标签: php sql wordpress

我想按喜欢的次数排序结果。我需要使用sql请求而不是新的查询参数。

在常规查询中,我应该使用 'orderby' => 'meta_value_num' 但是因为这是我使用的SQL请求 ORDER BY {$wpdb->prefix}postmeta.meta_value DESC;

这是我尝试过的:

$test = $wpdb->get_results ( "
SELECT * 
FROM  {$wpdb->prefix}postmeta
WHERE post_id LIKE '$get_the_ID_090909%' AND {$wpdb->prefix}postmeta.meta_key = '_liked' AND {$wpdb->prefix}postmeta.meta_value > 0
ORDER BY {$wpdb->prefix}postmeta.meta_value DESC;
        " );
        echo ' '.$test[0]->meta_value; // 2
        echo ' '.$test[1]->meta_value; // 14
        echo ' '.$test[2]->meta_value; // 10

正确的顺序应该是:

14
10
2

请注意,如果我使用“ ASC”,则顺序为10、14、2 如果我更改了喜欢的号码,它也会更改位置。有时候,根据喜欢的次数,顺序是正确的

var_dump():

 array(3) { [0]=> object(stdClass)#7998 (4) { ["meta_id"]=> string(3) "756" ["post_id"]=> string(12) "179090909185" ["meta_key"]=> string(6) "_liked" ["meta_value"]=> string(1) "2" } [1]=> object(stdClass)#8000 (4) { ["meta_id"]=> string(3) "696" ["post_id"]=> string(12) "179090909176" ["meta_key"]=> string(6) "_liked" ["meta_value"]=> string(2) "14" } [2]=> object(stdClass)#8001 (4) { ["meta_id"]=> string(3) "697" ["post_id"]=> string(12) "179090909170" ["meta_key"]=> string(6) "_liked" ["meta_value"]=> string(2) "10" } }

1 个答案:

答案 0 :(得分:3)

meta_value是一个varchar,表示所有值(包括数字)都按字符串排序。

排序时将列转换为INT:

ORDER BY CAST({$wpdb->prefix}postmeta.meta_value AS UNSIGNED) ASC