sql 查询中的“ORDER BY meta_value ASC”未正确排序价格
`ORDER BY meta_value ASC` in sql query is not sorting prices correctly
我正在使用 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 查询来完成。
是的,你是对的。 Meta_value 不是数字,这就是默认情况下无法对其进行排序的原因。
你可以像 juergen d 上面写的那样写 meta_value*1 。
或者您可以为此使用 SQL CAST:
SELECT * FROM `wp_postmeta`
WHERE meta_key = 'product_price'
ORDER BY CAST(meta_value as unsigned) ASC
meta_value
是一个字符串——这是 EAV 模型的本质。
在MySQL中,我喜欢为此使用静默转换。也就是说,只需将值视为数字并进行算术运算即可:
ORDER BY (meta_value + 0) ASC
静默转换的优点是它不会为非数字值生成错误。
我正在使用 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 查询来完成。
是的,你是对的。 Meta_value 不是数字,这就是默认情况下无法对其进行排序的原因。 你可以像 juergen d 上面写的那样写 meta_value*1 。 或者您可以为此使用 SQL CAST:
SELECT * FROM `wp_postmeta`
WHERE meta_key = 'product_price'
ORDER BY CAST(meta_value as unsigned) ASC
meta_value
是一个字符串——这是 EAV 模型的本质。
在MySQL中,我喜欢为此使用静默转换。也就是说,只需将值视为数字并进行算术运算即可:
ORDER BY (meta_value + 0) ASC
静默转换的优点是它不会为非数字值生成错误。