From 7168dd09dd2eb2333046c91e043563146433494e Mon Sep 17 00:00:00 2001 From: scribu Date: Mon, 6 Sep 2010 08:09:41 +0000 Subject: [PATCH] Rewrite WP_User_Query to use JOIN instead of subquery. See #14572 git-svn-id: https://develop.svn.wordpress.org/trunk@15579 602fd350-edb4-49c9-b593-d223f7449a82 --- wp-includes/functions.php | 7 ++----- wp-includes/user.php | 9 +++++---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/wp-includes/functions.php b/wp-includes/functions.php index f21fb6e66b..23f70f137f 100644 --- a/wp-includes/functions.php +++ b/wp-includes/functions.php @@ -4244,10 +4244,9 @@ function _wp_search_sql($string, $cols) { * * @param array $queries An array of queries * @param string $meta_id_column The column that holds the object id - * @param string $table Which meta table to look in * @return string */ -function _wp_meta_sql( $queries, $meta_id_column, $table ) { +function _wp_meta_sql( $queries, $meta_id_column ) { global $wpdb; $clauses = array(); @@ -4278,9 +4277,7 @@ function _wp_meta_sql( $queries, $meta_id_column, $table ) { return ''; return " - SELECT $meta_id_column - FROM $table - WHERE CASE meta_key + AND CASE meta_key " . implode( "\n", $clauses ) . " END GROUP BY $meta_id_column diff --git a/wp-includes/user.php b/wp-includes/user.php index b73c4f39e3..5dfce4ae17 100644 --- a/wp-includes/user.php +++ b/wp-includes/user.php @@ -463,10 +463,11 @@ class WP_User_Query { $meta_queries[] = wp_array_slice_assoc( $qv, array( 'meta_key', 'meta_value', 'meta_compare' ) ); - $meta_query_sql = _wp_meta_sql( $meta_queries, 'user_id', $wpdb->usermeta ); + $meta_query_sql = _wp_meta_sql( $meta_queries, 'user_id' ); if ( !empty( $meta_query_sql ) ) { - $this->query_where .= " AND $wpdb->users.ID IN ($meta_query_sql)"; + $this->query_from .= " INNER JOIN $wpdb->usermeta ON ($wpdb->users.ID = $wpdb->usermeta.user_id)"; + $this->query_where .= $meta_query_sql; } if ( !empty($qv['include']) ) { @@ -490,13 +491,13 @@ class WP_User_Query { function query() { global $wpdb; - $this->results = $wpdb->get_col("SELECT DISTINCT($wpdb->users.ID)" . $this->query_from . $this->query_where . $this->query_orderby . $this->query_limit); + $this->results = $wpdb->get_col("SELECT $wpdb->users.ID" . $this->query_from . $this->query_where . $this->query_orderby . $this->query_limit); if ( !$this->results ) return; if ( $this->query_vars['count_total'] ) - $this->total_users = $wpdb->get_var("SELECT COUNT(DISTINCT($wpdb->users.ID))" . $this->query_from . $this->query_where); + $this->total_users = $wpdb->get_var("SELECT COUNT($wpdb->users.ID)" . $this->query_from . $this->query_where); if ( 'all' == $this->query_vars['fields'] ) { cache_users($this->results);