Index: meta.php
===================================================================
--- meta.php	(revision 26192)
+++ meta.php	(working copy)
@@ -769,7 +769,16 @@
 			foreach ( $key_only_queries as $key => $q )
 				$where["key-only-$key"] = $wpdb->prepare( "$meta_table.meta_key = %s", trim( $q['key'] ) );
 		}
+		
+		// This is to handle most queries apart from the NOT EXISTS operator 
+		$i = count( $join );		
+		$main_alias = $i ? 'mt' . $i : $meta_table;
 
+		$join[$i]  = "INNER JOIN $meta_table";
+		$join[$i] .= $i ? " AS $main_alias" : '';
+		$join[$i] .= " ON ($primary_table.$primary_id_column = $main_alias.$meta_id_column)";
+		
+		// For each query, we'll use the main JOIN if the compare is not NOT EXISTS
 		foreach ( $queries as $k => $q ) {
 			$meta_key = isset( $q['key'] ) ? trim( $q['key'] ) : '';
 			$meta_type = $this->get_cast_for_type( isset( $q['type'] ) ? $q['type'] : '' );
@@ -791,10 +800,10 @@
 			) ) )
 				$meta_compare = '=';
 
-			$i = count( $join );
-			$alias = $i ? 'mt' . $i : $meta_table;
-
 			if ( 'NOT EXISTS' == $meta_compare ) {
+				$i = count( $join );
+				$alias = $i ? 'mt' . $i : $meta_table;
+			
 				$join[$i]  = "LEFT JOIN $meta_table";
 				$join[$i] .= $i ? " AS $alias" : '';
 				$join[$i] .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column AND $alias.meta_key = '$meta_key')";
@@ -804,17 +813,15 @@
 				continue;
 			}
 
-			$join[$i]  = "INNER JOIN $meta_table";
-			$join[$i] .= $i ? " AS $alias" : '';
-			$join[$i] .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column)";
-
 			$where[$k] = '';
 			if ( !empty( $meta_key ) )
-				$where[$k] = $wpdb->prepare( "$alias.meta_key = %s", $meta_key );
+				$where[$k] = $wpdb->prepare( "$main_alias.meta_key = %s", $meta_key );
 
+			// 
 			if ( is_null( $meta_value ) ) {
-				if ( empty( $where[$k] ) )
-					unset( $join[$i] );
+				if ( empty( $where[$k] ) ) {
+					// unset( $join[$i] );
+				}
 				continue;
 			}
 
@@ -823,7 +830,7 @@
 					$meta_value = preg_split( '/[,\s]+/', $meta_value );
 
 				if ( empty( $meta_value ) ) {
-					unset( $join[$i] );
+					//unset( $join[$i] );
 					continue;
 				}
 			} else {
@@ -845,7 +852,7 @@
 			if ( ! empty( $where[$k] ) )
 				$where[$k] .= ' AND ';
 
-			$where[$k] = ' (' . $where[$k] . $wpdb->prepare( "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $meta_value );
+			$where[$k] = ' (' . $where[$k] . $wpdb->prepare( "CAST($main_alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $meta_value );
 		}
 
 		$where = array_filter( $where );
