在深入研究我的问题时,似乎唯一的方法是进行两个查询:
首先,询问所有有猫的宠物主人
$cat_owners = new WP_Query([
"post_type" => "pet_owners",
"posts_per_page" => -1,
"meta_key" => "animal",
"meta_value" => "cat"
])
然后,查询所有不在第一次查询结果中但至少拥有一只宠物的宠物主人(因此
"meta_compare" => "EXISTS"
):
$not_cat_owners = new WP_Query([
"post_type" => "pet_owners",
"posts_per_page" => -1,
"post__not_in" => $cat_owners,
"meta_key" => "animal",
"meta_compare" => "EXISTS"
])
这将产生一个没有猫的宠物主人列表,但对一组结果进行两次WP\\U查询感觉很愚蠢,因此我选择使用$wpdb类直接对DB进行查询。
这允许以下情况:
$wpdb->get_results("SELECT ID FROM $wpdb->posts
WHERE post_status = \'publish\'
AND post_type = \'pet_owner\'
AND ID IN
(SELECT post_id FROM $wpdb->postmeta
WHERE meta_key = \'animal\')
AND ID NOT IN
(SELECT post_id FROM $wpdb->postmeta
WHERE meta_key = \'animal\'
AND meta_value = \'cat\')");
我猜从技术上讲,这是三个查询(主查询和两个嵌套查询),但看起来更干净、更简单。我很想知道是否有比我更好的SQL技能的人可以想出一种更有效的方法来实现这一点。