从wp_postmeta中选择max(META_VALUE),其中META_KEY=‘价格’...当值超过999时停止工作

时间:2012-06-11 作者:Kirkland

Overview: 我不想回复帖子。我只是希望所有帖子中某个特定meta\\u值的单个最高值。。。只是价值本身。

Details: 我在所有帖子中添加了一个自定义meta\\u键“price”。值始终为整数(无小数或非数字字符)。我正在尝试执行一个查询,返回与此特定meta\\u键关联的最高/最大/最大meta\\u值。

Buggy Code

function max_meta_value(){
    global $wpdb;
    $query = "SELECT max(meta_value) FROM wp_postmeta WHERE meta_key=\'price\'";
    $the_max = $wpdb->get_var($query);
    return $the_max;
}
Buggy Results: 起初,我认为上面的代码是有效的,因为如果所有meta\\u值都小于999,则会有效。我很快发现,如果meta\\u值大于999,那么它就会被忽略。因此,上面的代码实际上为我提供了meta\\u值小于1000的最大值(meta\\u值)。

Plea to Community: 显然,我不知道它为什么会失败,但我有一种感觉,它与WP存储值的方式有关——可能与它的数据类型有关?或者我不应该使用$wpdb->get\\u var()。任何指导都将不胜感激。

3 个回复
最合适的回答,由SO网友:Dakshinamurthy Karra 整理而成

meta\\u值不是整数类型,max无法返回正确的值。您可以使用mysqlcast 方法转换为整数,如下所示:

SELECT max(cast(meta_value as unsigned)) FROM wp_postmeta WHERE meta_key=\'price\'

SO网友:szajmon

我修改了原始函数和KDM的解决方案,使其具有更通用的函数。它是这样的:

function end_meta_value( $end = "max", $meta )
{
    global $wpdb;
    $query = $wpdb->prepare( 
        "SELECT %s( cast( meta_value as UNSIGNED ) ) FROM {$wpdb->postmeta} WHERE meta_key=\'%s\'",
        $end,
        $meta
    );
    return $wpdb->get_var( $query );
}
通过这种方式,您可以获得任何自定义meta\\u值的最小值和最大值。我也改变了wp_postmeta$wpdb->postmeta 以适应您使用的任何前缀。

注意:如果要查询数字,请替换%s$wpdb->prepare() 具有的声明%d.

SO网友:Laxmana

我修改了szajmon解决方案以使用wp\\u缓存,并修复了我得到的sql语法错误。

wpdb->prepare用引号将$end变量包装起来,这会引发一个错误(至少在我的例子中是这样)

function get_min_max_meta_value( $type = \'max\', $key ){

    global $wpdb;
    $cash_key = md5($key . $type);
    $results = wp_cache_get($key);

    if($results === false){

        $sql = "SELECT " . $type . "( cast( meta_value as UNSIGNED ) ) FROM {$wpdb->postmeta} WHERE meta_key=\'%s\'";
        $query = $wpdb->prepare( $sql, $key);

        return $wpdb->get_var( $query );

    }

    return $results;
}

结束