it-swarm.com.de

SELECT max (meta_value) FROM wp_postmeta WHERE meta_key = 'price' ... funktioniert nicht mehr, wenn der Wert über 999 liegt

Übersicht : Ich versuche nicht, einen Beitrag zurückzugeben. Ich möchte einfach den höchsten Einzelwert für einen bestimmten meta_value über alle Beiträge hinweg ... nur den Wert selbst.

Details : Ich habe allen meinen Beiträgen einen benutzerdefinierten meta_key "price" hinzugefügt. Der Wert ist immer eine Ganzzahl (keine Dezimalstellen oder nicht numerischen Zeichen). Ich versuche, eine Abfrage durchzuführen, die den höchsten/größten/maximalen meta_value zurückgibt, der mit diesem bestimmten meta_key verbunden ist.

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 : Zuerst dachte ich, dass der obige Code funktioniert, weil er funktioniert, wenn alle meta_values ​​kleiner als 999 sind. Ich stellte bald fest, dass wenn der meta_value größer als 999 ist, wird er ignoriert. Der obige Code gibt mir also das Maximum (meta_value) für meta_values ​​kleiner als 1000.

Plädoyer für die Gemeinschaft : Offensichtlich weiß ich nicht, warum es fehlschlägt, aber ich habe das Gefühl, dass es etwas damit zu tun hat, wie WP den Wert speichert - vielleicht hängt es mit dem Datentyp zusammen? Oder vielleicht sollte ich nicht $ wpdb-> get_var () verwenden. Jede Anleitung wird sehr geschätzt.

4
Kirkland

Der meta_value ist kein ganzzahliger Typ, damit max die richtigen Werte zurückgibt. Sie können die mysql cast -Methode verwenden, um wie folgt in Ganzzahlen zu konvertieren:

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

13

Ich habe die ursprüngliche Funktion und die KDM-Lösung geändert, um eine universellere Funktion zu erhalten. Es geht so:

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

Auf diese Weise können Sie sowohl minimale als auch maximale Werte für jeden benutzerdefinierten meta_value abrufen. Ich habe auch wp_postmeta in $wpdb->postmeta geändert, um jedem von Ihnen verwendeten Präfix zu entsprechen.

Hinweis: Wenn Sie eine Ziffer abfragen möchten, ersetzen Sie %s in der Anweisung $wpdb->prepare() durch %d.

3
szajmon

Ich habe die szajmon-Lösung geändert, um mit wp_cache zu arbeiten und den SQL-Syntaxfehler zu beheben, den ich bekomme.

wpdb-> prepare bricht die Variable $ end in Anführungszeichen und das löst einen Fehler aus (zumindest in meinem Fall)

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