SELECT max(meta_value) FROM wp_postmeta WHERE meta_key='price'... smette di funzionare quando il valore supera 999

11 giu 2012, 08:19:02
Visualizzazioni: 14.7K
Voti: 6

Panoramica: Non sto cercando di restituire un post. Voglio semplicemente il singolo valore più alto per un particolare meta_value tra tutti i post... solo il valore stesso.

Dettagli: Ho aggiunto un meta_key personalizzato "price" a tutti i miei post. Il valore è sempre un intero (senza decimali o caratteri non numerici). Sto cercando di eseguire una query che restituisca il meta_value più alto/più grande/massimo associato a questo specifico meta_key.

Codice problematico

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

Risultati problematici: All'inizio pensavo che il codice sopra funzionasse, perché lo fa se tutti i meta_value sono inferiori a 999. Ho poi scoperto che se il meta_value è maggiore di 999 viene ignorato. Quindi in realtà il codice sopra mi restituisce il max(meta_value) solo per meta_value inferiori a 1000.

Appello alla comunità: Ovviamente non so perché fallisce, ma ho la sensazione che abbia a che fare con il modo in cui WP memorizza il valore - forse è legato al tipo di dato? O forse non dovrei usare $wpdb->get_var(). Qualsiasi guida sarà molto apprezzata.

0
Tutte le risposte alla domanda 4
1
16

Il meta_value non è di tipo intero per restituire valori corretti con max. Puoi utilizzare il metodo cast di MySQL per convertirlo in interi come segue:

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

11 giu 2012 08:51:28
Commenti

Includere solo i post pubblicati: http://pastebin.com/pR6SDEdf

emc emc
16 mag 2013 02:24:50
1

Ho modificato la funzione originale e la soluzione di KDM per ottenere una funzione più universale. Ecco come si presenta:

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

In questo modo puoi ottenere sia i valori minimi che massimi di qualsiasi meta_value personalizzato. Ho anche cambiato wp_postmeta in $wpdb->postmeta per adattarsi a qualsiasi prefisso tu utilizzi.

Nota: Se vuoi eseguire una query per una cifra, sostituisci %s nell'istruzione $wpdb->prepare() con %d.

21 mag 2013 03:05:10
Commenti

Grazie per la tua risposta. Ricevo un errore di sintassi SQL. Il problema è che wpdb->prepare racchiude la variabile $end tra '', quindi la query diventa SELECT 'max'(cast.... e questo genera un errore. Puoi concatenarla così: $sql = "SELECT " . $end . "(cast...". Questo ha funzionato per me.

Laxmana Laxmana
6 mag 2014 17:29:05
0

Ho modificato la soluzione di szajmon per funzionare con wp_cache e correggere l'errore di sintassi SQL che ottengo.

wpdb->prepare racchiude la variabile $end tra virgolette e questo genera un errore (almeno nel mio caso)

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;
}
6 mag 2014 17:42:31
0

Ecco un modo approssimativo con cui l'ho realizzato utilizzando la funzione php max sugli array e la WP_Query integrata

    function get_max_post_meta_value($category_id) {

    $args = array(  
    'post_type' => 'cpt-name',
    'post_status' => 'publish',
    'cat' => $category_id,
    'posts_per_page' => 1000, 
    );

    $max_meta_value_array = array();

    $loop = new WP_Query( $args ); 

    while ( $loop->have_posts() ) : $loop->the_post(); 

            array_push($max_meta_value_array, get_post_meta( get_the_ID(), 'post_meta_name', true)  );

    endwhile;

    wp_reset_postdata(); 

    return max($max_meta_value_array) ; 

    }
28 lug 2022 23:33:36