Triple meta_key в пользовательском запросе SELECT

Я использую странный запрос SELECT для вычисления среднего значения всех рейтингов сообщений (хранящихся в wp_postmeta ) для определенного пользователя.

Мой запрос в основном использует следующие аргументы:

post_author = 1 И meta_key = 'rating' И meta_value != 0 .

Этот запрос отлично работает на своем, но здесь он становится сложным. Мне нужно добавить некоторые исключения …

meta_key = 'anonymous' И meta_value != 'true'

И другой…

meta_key = 'original_author' И meta_value = ''

Я хочу получить только rating meta_values, поэтому я, вероятно, $wpdb->postmeta.meta_value большими проблемами, используя $wpdb->postmeta.meta_value .

Это составляет до 3 аргументов meta_key и meta_value , только с одним meta_value которое я действительно хочу получить. Это просто становится все сложнее …

Смотрите мой код ниже:

 // Example value $user_id = 1; // Calculate average post rating for user $ratings_query = $wpdb->get_results( $wpdb->prepare(" SELECT $wpdb->postmeta.meta_value FROM $wpdb->postmeta JOIN $wpdb->posts ON ($wpdb->postmeta.post_id = $wpdb->posts.id) WHERE ( $wpdb->posts.post_author = %d AND $wpdb->posts.post_type = 'post' AND $wpdb->posts.post_status = 'publish' AND $wpdb->postmeta.meta_key = 'rating' AND $wpdb->postmeta.meta_value != 0 AND $wpdb->postmeta.meta_key = 'anonymous' AND $wpdb->postmeta.meta_value != 'true' AND $wpdb->postmeta.meta_key = 'original_author' AND $wpdb->postmeta.meta_value = '') ", $user_id), ARRAY_N); if ( $ratings_query ) { $ratings_query = call_user_func_array('array_merge', $ratings_query); $average_rating = round(array_sum($ratings_query) / count($ratings_query), 1); } else { $average_rating = 0; } 

Solutions Collecting From Web of "Triple meta_key в пользовательском запросе SELECT"

Ваш запрос неверен. Чтобы получить метазначения для triple meta_key, вам понадобится 3 разных объединения, используя столбики meta в таблице posts. Проверьте код ниже:

 // Example value $user_id = 1; // Calculate average post rating for user $ratings_query = $wpdb->get_results( $wpdb->prepare(" SELECT pmeta.meta_value FROM wp_posts LEFT JOIN $wpdb->postmeta AS pmeta ON (pmeta.post_id = $wpdb->posts.id) LEFT JOIN $wpdb->postmeta AS pmeta1 ON (pmeta1.post_id = $wpdb->posts.id) LEFT JOIN $wpdb->postmeta AS pmeta2 ON (pmeta2.post_id = $wpdb->posts.id) WHERE $wpdb->posts.post_author = %d AND $wpdb->posts.post_type = 'post' AND $wpdb->posts.post_status = 'publish' AND ( pmeta.meta_key = 'rating' AND CAST(pmeta.meta_value AS CHAR) != '0' ) AND ( pmeta1.meta_key = 'anonymous' AND CAST(pmeta1.meta_value AS CHAR) != 'true' ) AND ( pmeta2.meta_key = 'original_author' AND CAST(pmeta2.meta_value AS CHAR) = '' )", $user_id), ARRAY_N); 

Для извлечения метаданных с использованием пользовательского запроса вам потребуется 1 соединение для каждой пары метаданных в таблице сообщений, как указано выше.

если вы печатаете последний SQL-запрос с использованием кода echo $wpdb->last_query; , вы получите SQL-запрос:

 SELECT pmeta.meta_value FROM wp_posts LEFT JOIN wp_postmeta AS pmeta ON (pmeta.post_id = wp_posts.id) LEFT JOIN wp_postmeta AS pmeta1 ON (pmeta1.post_id = wp_posts.id) LEFT JOIN wp_postmeta AS pmeta2 ON (pmeta2.post_id = wp_posts.id) WHERE wp_posts.post_author = 1 AND wp_posts.post_type = 'post' AND wp_posts.post_status = 'publish' AND ( pmeta.meta_key = 'rating' AND CAST(pmeta.meta_value AS CHAR) != '0' ) AND ( pmeta1.meta_key = 'anonymous' AND CAST(pmeta1.meta_value AS CHAR) != 'true' ) AND ( pmeta2.meta_key = 'original_author' AND CAST(pmeta2.meta_value AS CHAR) = '' ) 

В другом ответе нет ничего плохого, но я подумал, что добавлю это как другой метод, поскольку он прост и использует WP для разработки SQL-запроса. Это будет немного тяжелее для ресурсов, поскольку есть дополнительные запросы с функцией get_post_meta .

 $user_id = 1; $args = array( 'post_type' => 'post', 'posts_per_page' => -1, 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'ASC', 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'post_author', 'value' => $user_id ), array( 'key' => 'rating', 'compare' => '!=', // or'>' 'value' => 0 ), array( 'key' => 'anonymous', 'compare' => '!=', 'value' => true ), array( 'key' => 'original_author', 'compare' => '!=', 'value' => '' ) ) ); $RelevantPosts = get_posts($args); $ratings = array(); foreach($RelevantPosts as $RelevantPost) { $ratings[] = get_post_meta($RelevantPost->ID, 'rating' , true); } if ( $RelevantPosts ) { $average_rating = round(array_sum($ratings) / count($ratings), 1); } else { $average_rating = 0; } 

Однако он прост для чтения и понимания и до тех пор, пока он не запускается массово (например, для всех ваших пользователей одновременно), это должно быть хорошо для ресурсов.