web-dev-qa-db-ja.com

SELECT max(meta_value)FROM wp_postmeta WHERE meta_key = 'price' ...値が999を超えると動作を停止します

概要 :私は投稿を返そうとしていません。私は単に、すべての投稿にわたる特定のmeta_valueの単一の最高値が欲しいのです。ただ値そのものです。

詳細 :私はすべての投稿にカスタムmeta_key "price"を追加しました。値は常に整数です(小数点以下の文字も数字以外の文字もなし)。この特定のmeta_keyに関連付けられている最大/最大/最大の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;
}

バグのある結果 :最初、上記のコードはすべてのmeta_valuesが999未満であればうまくいくと考えていました。meta_valueが999を超えると無視されることがすぐにわかりました。そのため、上記のコードでは、meta_valuesの最大値(meta_value)が1000未満になっています。

コミュニティーへの祈り :明らかに失敗した理由はわかりませんが、WPが値をどのように格納するかに関係していると感じます - おそらくそのデータ型は関係していますか?あるいは、私は$ wpdb-> get_var()を使うべきではありません。任意のガイダンスは大歓迎です。

4
Kirkland

Meta_valueは、maxが適切な値を返す整数型ではありません。次のようにmysqlのcastメソッドを使って整数に変換することができます。

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

13

私は、より普遍的な機能を持つようにオリジナルの機能と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_valueの最小値と最大値の両方を取得できます。私はまたあなたが使うプレフィックスに合うようにwp_postmeta$wpdb->postmetaに変更しました。

注:数字を照会したい場合は、$wpdb->prepare()ステートメントの%s%dに置き換えてください。

3
szajmon

私はwp_cacheで動作するようにszajmonソリューションを修正し、取得した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;
}
0
Laxmana