it-swarm.com.de

Wählen Sie aus wp_post und multiple meta_value aus wp_postmeta

Mein Mangel an SQL-Kenntnissen hat mich hier in meinen Spuren aufgehalten.

Ich versuche, post_id, post_title und zwei Postmeta-Werte auszuwählen - der erste hat den Metaschlüssel von 'search_country' und der zweite einen Metaschlüssel von 'search_region'.

Ich glaube, ich habe eine funktionierende Lösung, um nur das search_country abzurufen:

 $querystr = "
       SELECT $wpdb->posts.ID as id, $wpdb->posts.post_title as title, $wpdb->postmeta.meta_value as country
       FROM $wpdb->posts, $wpdb->postmeta
       WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id 
       AND $wpdb->postmeta.meta_key = 'search_country' 
       AND $wpdb->posts.post_status = 'publish' 
       AND $wpdb->posts.post_type = 'films'
       AND $wpdb->postmeta.meta_value IS NOT NULL
       ORDER BY $wpdb->posts.post_title ASC
    ";

    $festivals = $wpdb->get_results($querystr, OBJECT);

Allerdings weiß ich nicht, wie ich das ändern soll, um auch die search_region zu erhalten?

Ich bin noch nie mit SQL klar gekommen :)

1
Chris

Sie müssen die Tabelle post_meta zweimal mit der Tabelle posts verknüpfen, und zwar einmal für jeden Metawert:

SELECT p.ID id, p.post_title title, country.meta_value country, region.meta_value region
FROM {$wpdb->posts} p
JOIN {$wpdb->postmeta} country 
    ON p.ID = country.post_id AND country.meta_key = 'search_country'
JOIN {$wpdb->postmeta} region
    ON p.ID = region.post_id AND region.meta_key = 'search_region'
WHERE 
    p.post_status = 'publish'
    AND p.post_type = 'films'
ORDER BY p.post_title ASC

Ich würde empfehlen, die Tabellen (p, country und region) zu aliasen, um die Lesbarkeit zu verbessern, da Sie zweimal derselben Tabelle beitreten. Wenn Sie gleichzeitig einen anderen meta_value haben möchten, können Sie weitere Male der post_meta-Tabelle beitreten.

Wenn Sie JOIN verwenden, geben Sie nur Ergebnisse zurück, bei denen der Beitrag einen Wert für beide Metaschlüssel enthält. Wenn Sie zulassen möchten, dass einer NULL ist, würden Sie stattdessen die Tabelle LEFT JOIN.

2
doublesharp