web-dev-qa-db-fra.com

SELECT max (meta_value) FROM wp_postmeta WHERE meta_key = 'price' ... cesse de fonctionner lorsque la valeur est supérieure à 999

Vue d'ensemble : Je n'essaie pas de retourner un message. Je veux simplement la valeur unique la plus élevée pour une meta_value particulière parmi tous les articles ... juste la valeur elle-même.

Détails : J'ai ajouté un "prix" meta_key personnalisé à tous mes messages. La valeur est toujours un entier (pas de décimales ni de caractères non numériques). J'essaie de faire une requête qui retourne la meta_value la plus haute/la plus grande/la plus grande associée à cette meta_key particulière.

Code Buggy

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 : Au début, je pensais que le code ci-dessus fonctionnait, car si toutes les valeurs méta-valeurs sont inférieures à 999, j'ai vite découvert que, si la valeur méta est supérieure à 999, elle est ignorée. Le code ci-dessus me donne donc le maximum (meta_value) pour les meta_values ​​inférieures à 1000.

Plea to Community : Évidemment, je ne sais pas pourquoi cela échoue, mais j’ai le sentiment que cela a quelque chose à voir avec la façon dont WP stocke la valeur - peut-être son type de données? Ou peut-être que je ne devrais pas utiliser $ wpdb-> get_var (). Toute orientation sera grandement appréciée.

4
Kirkland

Meta_value n'est pas de type entier pour que max renvoie les valeurs correctes. Vous pouvez utiliser la méthode mysql cast pour convertir en entiers comme suit:

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

13

J'ai modifié la fonction d'origine et la solution de KDM afin de lui donner une fonction plus universelle. Ça va comme ça:

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

De cette façon, vous pouvez obtenir les valeurs minimales et maximales de toute méta_value personnalisée. J'ai également changé wp_postmeta en $wpdb->postmeta pour s'adapter à tout préfixe que vous utilisez.

Remarque: Si vous souhaitez interroger un chiffre, remplacez %s dans l'instruction $wpdb->prepare() par %d.

3
szajmon

J'ai modifié la solution szajmon pour fonctionner avec wp_cache et corriger l'erreur de syntaxe SQL que je reçois.

wpdb-> prepare encapsule la variable $ end avec des guillemets et crée une erreur (du moins dans mon cas)

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