sql查询中的“ORDER BY meta_value ASC”没有正确排序价格

时间:2017-10-31 14:42:15

标签: php mysql sql wordpress advanced-custom-fields

我使用wordpress,在网站上有产品,产品价格是后端的自定义字段。

我有一个页面,产品应按价格从高到低排序,反之亦然。

我的Sql查询如下所示:

SELECT * FROM `wp_postmeta` WHERE meta_key = 'product_price' ORDER BY meta_value ASC

以上查询并未将价格从低到高排序。

但是当我尝试以下面的方式做到这一点时,它完美地运作:

$args = array(
    'post_type' => 'product-items',
    'meta_key' => 'product_price',
    'orderby' => 'meta_value',
    'order' => 'ASC',
    'post_status' => 'publish',
    'posts_per_page'=> -1
);
$productList = get_posts($args);

在数据库中,我看到meta_value列类型是longtext。也许这就是为什么它没有正确排序的问题。但是它如何以第二种方式起作用。

我会使用第二个选项,但我的代码需要通过sql查询来执行,具体取决于其他一些选项。

2 个答案:

答案 0 :(得分:1)

是的,你是对的。 Meta_value不是数字,这是默认情况下无法对其进行排序的原因。 您可以像上面写的juergen一样编写meta_value * 1。 或者您可以使用SQL CAST:

SELECT * FROM `wp_postmeta` 
WHERE meta_key = 'product_price' 
ORDER BY CAST(meta_value as unsigned) ASC

答案 1 :(得分:1)

meta_value是一个字符串 - 这是EAV模型的本质。

在MySQL中,我喜欢使用静默转换。也就是说,只需将值视为数字并执行算术:

ORDER BY (meta_value + 0) ASC

静默转换的优点是它不会为非数字值生成错误。