Итак, мне нужно написать запрос к базе данных, чтобы получить значение meta_value из key b
на основе стоимости key_a
а также category
,
Вот мой sql:
$cat = $post['cat'];
$adh = $post['adhesion'];
//get adhesions for category
$query = $wpdb->get_results(
"SELECT p.`ID`, pm.`meta_value` FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} `p` ON `p`.`ID` = pm.`post_id`
LEFT JOIN {$wpdb->term_relationships} `tr` ON `p`.`ID` = `tr`.`object_id`
LEFT JOIN {$wpdb->term_taxonomy} `tt` ON `tr`.`term_taxonomy_id` = `tt`.`term_taxonomy_id`
WHERE `pm`.`meta_key` = 'substrate_box'
AND `pm`.`meta_key` = 'adhesion_box'
AND `pm`.`meta_value` = '$adh'
AND `p`.`post_status` = 'publish'
AND `p`.`post_type` = 'post'
AND `tt`.`taxonomy` = 'category'
AND `tt`.`term_id` = $cat
");
Что мне нужно сделать, это получить значение meta_key substrate_box
для каждого сообщения, имеющего ОБА значение категории И первое значение мета-ключа (adhesion_box
).
Этот SQL-оператор возвращает ноль, поэтому я не совсем уверен, как это сделать.
Переместите условия предложения WHERE в предложение ON.
SELECT p.`ID`, pm.`meta_value` FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} `p` ON `p`.`ID` = pm.`post_id`
LEFT JOIN {$wpdb->term_relationships} `tr` ON `p`.`ID` = `tr`.`object_id`
LEFT JOIN {$wpdb->term_taxonomy} `tt` ON `tr`.`term_taxonomy_id` = `tt`.`term_taxonomy_id`
AND `pm`.`meta_key` = 'substrate_box'
AND `pm`.`meta_key` = 'adhesion_box'
AND `pm`.`meta_value` = '$adh'
AND `p`.`post_status` = 'publish'
AND `p`.`post_type` = 'post'
AND `tt`.`taxonomy` = 'category'
AND `tt`.`term_id` = $cat
Вот решение, которое в итоге заработало, простите за уродство
$cat = $post['cat'];
$adh = $post['adhesion'];
//get adhesions for category
$query = $wpdb->get_results("SELECT pm.`post_id` FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} `p` ON `p`.`ID` = pm.`post_id`
LEFT JOIN {$wpdb->term_relationships} `tr` ON `p`.`ID` = `tr`.`object_id`
LEFT JOIN {$wpdb->term_taxonomy} `tt` ON `tr`.`term_taxonomy_id` = `tt`.`term_taxonomy_id`
WHERE `pm`.`meta_key` = 'adhesion_box'
AND `pm`.`meta_value` = '$adh'
AND `p`.`post_status` = 'publish'
AND `p`.`post_type` = 'post'
AND `tt`.`taxonomy` = 'category'
AND `tt`.`term_id` = $cat
");
if(is_array($query)){
foreach($query as $obj){
$tmps = $wpdb->get_results("SELECT p.`ID` as post_id, pm.`meta_value` FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} `p` ON `p`.`ID` = pm.`post_id`
WHERE pm.`post_id` = {$obj->post_id}
AND pm.`meta_key` = 'substrate_box'
");
if(is_array($tmps) && count($tmps) > 0){
foreach($tmps as $tmp){
$return[$tmp->post_id] = $tmp->meta_value;
}
}
}
}
Это выбирает и возвращает второе мета-значение на основе категории поста и первого мета-значения.