ВЫБЕРИТЕ max(мета-значение) ИЗ wp postmeta, ГДЕ мета-ключ="цена"... перестает работать, когда значение превышает 999


Обзор: Я не пытаюсь вернуть сообщение. Мне просто нужно единственное наивысшее значение для определенного meta_value во всех сообщениях... просто сама ценность.

Подробности: Я добавил пользовательский мета_кей "цена" ко всем своим публикациям. Значение всегда является целым числом (без десятичных знаков или нечисловых символов). Я пытаюсь выполнить запрос, который возвращает наибольшее/наибольшее/максимальное мета_значение, связанное с этим конкретным мета_кей.

Ошибочный Код

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;
}

Результаты с ошибками: Сначала я подумал, что приведенный выше код работает, потому что он работает, если все мета_значения меньше 999. Вскоре я обнаружил, что если значение meta_value больше 999, то оно игнорируется. Так что на самом деле приведенный выше код дает мне максимальное значение (meta_value) для meta_values менее 1000.

Просьба к сообществу: Очевидно, я не знаю, почему это не удается, но у меня такое чувство, что это как-то связано с тем, как WP сохраняет значение - возможно, это связано с типом данных? Или, может быть, мне не следует использовать $wpdb->get_var(). Любые рекомендации будут с благодарностью приняты.

Author: Kirkland, 2012-06-11

3 answers

Значение meta_value не относится к целочисленному типу, чтобы max возвращал правильные значения. Вы можете использовать метод mysql cast для преобразования в целые числа следующим образом:

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

 15
Author: Dakshinamurthy Karra, 2012-06-11 05:51:28

Я изменил исходную функцию и решение 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 );
}

Таким образом, вы можете получить как минимальное, так и максимальное значения любого пользовательского мета_значения. Я также изменил wp_postmeta на $wpdb->postmeta, чтобы соответствовать любому используемому вами префиксу.

Примечание: Если вы хотите запросить цифру, замените %s в операторе $wpdb->prepare() на %d.

 3
Author: szajmon, 2013-11-04 11:49:51

Я изменил решение szajmon для работы с wp_cache и исправил полученную синтаксическую ошибку sql.

Wpdb->подготовка заключает переменную $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;
}
 2
Author: Laxmana, 2014-05-06 14:42:31