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 :)
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.