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

Posted

技术标签:

【中文标题】sql查询中的“ORDER BY meta_value ASC”未正确排序价格【英文标题】:`ORDER BY meta_value ASC` in sql query is not sorting prices correctly 【发布时间】:2018-04-12 18:45:08 【问题描述】:

我正在使用 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 查询来完成,具体取决于其他一些事情。

【问题讨论】:

试试ORDER BY cast(meta_value as unsigned) ASC 出于这个原因,在使用 EAV 模型时,我喜欢根据它们的类型来分离属性 - 所以,通常,一个整数类型的表,一个日期类型的表,一个表小数的东西。和一个字符串表。 (ORDER BY meta_value + 0 也可以) @juergend 非常感谢,完美运行 【参考方案1】:

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

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

ORDER BY (meta_value + 0) ASC

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

【讨论】:

作为一个魅力,谢谢!【参考方案2】:

是的,你是对的。 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

【讨论】:

以上是关于sql查询中的“ORDER BY meta_value ASC”未正确排序价格的主要内容,如果未能解决你的问题,请参考以下文章

JOINS 的大型查询中的 SQL 子查询链

在SQLServer中的查询语句

oracle 中的 sql语句查询

SQL中的模糊查询语句

有关 SQL Server 中的 SQL 查询提示的详细信息

查询View中的字段sql语句