web-dev-qa-db-fra.com

Choisissez parmi wp_post et plusieurs meta_value dans wp_postmeta

Mon manque de compétences en SQL m'a arrêté dans mes traces ici.

J'essaie de sélectionner post_id, post_title et deux valeurs postmeta - la première contient la méta_key de 'search_country' et la seconde une méta_key de 'search_region'.

Je pense avoir une solution de travail pour récupérer uniquement le search_country:

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

Cependant, je ne sais pas comment changer ceci pour obtenir la région de recherche également?

Je n'ai jamais eu avec SQL :)

1
Chris

Vous devez joindre la table post_meta deux fois à la table posts, une fois pour chaque méta-valeur:

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

Je recommanderais d'aliaser les tables (p, country et region) pour le rendre un peu plus facile à lire puisque vous rejoignez deux fois la même table. Si vous vouliez un autre meta_value en même temps, vous pouvez joindre plusieurs fois à la table post_meta.

En utilisant JOIN, vous ne renvoyez que des résultats pour lesquels la publication a une valeur pour les deux clés méta ... si vous souhaitez en autoriser une à être NULL, vous devriez plutôt LEFT JOIN la table.

2
doublesharp