Index: wp-includes/query.php
===================================================================
--- wp-includes/query.php	(revision 15513)
+++ wp-includes/query.php	(working copy)
@@ -1266,10 +1266,13 @@
 		$qv['cat'] = preg_replace( '|[^0-9,-]|', '', $qv['cat'] ); // comma separated list of positive or negative integers
 		$qv['pagename'] = trim( $qv['pagename'] );
 		$qv['name'] = trim( $qv['name'] );
+		$qv['meta_key'] = (array) $qv['meta_key'];
+		$qv['meta_value'] = (array) $qv['meta_value'];
+		$qv['meta_compare'] = (array) $qv['meta_compare'];
 		if ( '' !== $qv['hour'] ) $qv['hour'] = absint($qv['hour']);
 		if ( '' !== $qv['minute'] ) $qv['minute'] = absint($qv['minute']);
 		if ( '' !== $qv['second'] ) $qv['second'] = absint($qv['second']);
-
+		
 		// Compat.  Map subpost to attachment.
 		if ( '' != $qv['subpost'] )
 			$qv['attachment'] = $qv['subpost'];
@@ -2296,17 +2299,27 @@
 		}
 
 		// postmeta queries
-		if ( ! empty($q['meta_key']) || ! empty($q['meta_value']) )
-			$join .= " JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) ";
-		if ( ! empty($q['meta_key']) )
-			$where .= $wpdb->prepare(" AND $wpdb->postmeta.meta_key = %s ", $q['meta_key']);
+		$meta_table_aliases = array();
+		if ( ! empty($q['meta_key']) || ! empty($q['meta_value']) ) {
+			foreach( $q['meta_key'] as $key => $value ) {
+				$meta_table_aliases[$key] = $wpdb->postmeta . ( $key ? '_' . $key : '' );			 
+				$join .= " JOIN $wpdb->postmeta " . ( $meta_table_aliases[$key] != $wpdb->postmeta ? "as {$meta_table_aliases[$key]} " : '' ) . "ON ($wpdb->posts.ID = {$meta_table_aliases[$key]}.post_id) ";
+			}
+		}
+		if ( ! empty($q['meta_key']) ) {
+			foreach( $q['meta_key'] as $key => $value ) {
+				$where .= $wpdb->prepare(" AND {$meta_table_aliases[$key]}.meta_key = %s ", $value);
+			}
+		}
+				
 		if ( ! empty($q['meta_value']) ) {
-			if ( empty($q['meta_compare']) || ! in_array($q['meta_compare'], array('=', '!=', '>', '>=', '<', '<=')) )
-				$q['meta_compare'] = '=';
-
-			$where .= $wpdb->prepare("AND $wpdb->postmeta.meta_value {$q['meta_compare']} %s ", $q['meta_value']);
+			foreach( $q['meta_key'] as $key => $value ) {
+				if ( empty($q['meta_compare'][$key]) || ! in_array($q['meta_compare'][$key], array('=', '!=', '>', '>=', '<', '<=')) )
+					$q['meta_compare'][$key] = '=';
+				$where .= $wpdb->prepare("AND {$meta_table_aliases[$key]}.meta_value {$q['meta_compare'][$key]} %s ", $q['meta_value'][$key]);
+			}
 		}
-
+		
 		// Apply filters on where and join prior to paging so that any
 		// manipulations to them are reflected in the paging by day queries.
 		if ( !$q['suppress_filters'] ) {
