Index: wp-includes/query.php
===================================================================
--- wp-includes/query.php	(revision 18228)
+++ wp-includes/query.php	(working copy)
@@ -2261,22 +2261,37 @@
 		if ( empty($q['author']) || ($q['author'] == '0') ) {
 			$whichauthor = '';
 		} else {
-			$q['author'] = (string)urldecode($q['author']);
-			$q['author'] = addslashes_gpc($q['author']);
-			if ( strpos($q['author'], '-') !== false ) {
-				$eq = '!=';
-				$andor = 'AND';
-				$q['author'] = explode('-', $q['author']);
-				$q['author'] = (string)absint($q['author'][1]);
+			if ( is_array( $q['author'] ) ) {
+				$author_array = $q['author'];
 			} else {
-				$eq = '=';
-				$andor = 'OR';
+				// String values have to be sanitized and turn into an array
+				$q['author'] = (string)urldecode($q['author']);
+				$q['author'] = addslashes_gpc($q['author']);
+				$author_array = preg_split('/[,\s]+/', $q['author']);
 			}
-			$author_array = preg_split('/[,\s]+/', $q['author']);
+			
 			$_author_array = array();
-			foreach ( $author_array as $key => $_author )
-				$_author_array[] = "$wpdb->posts.post_author " . $eq . ' ' . absint($_author);
-			$whichauthor .= ' AND (' . implode(" $andor ", $_author_array) . ')';
+			$op = 'NOT IN';
+			foreach ( $author_array as $key => $_author ) {
+				if ( 'NOT IN' == $op ) {
+					if ( strpos($_author, '-') === false ) {
+						// A single non-negative author switches the query
+						// from NOT IN to IN
+						$_author_array = array( absint( $_author ) );
+						$op = 'IN';
+					} else {
+						// Add to the NOT IN array
+						$_author_array[] = absint( $_author );
+					}
+				} else {
+					// Once the query becomes IN, we can skip NOT IN authors
+					if ( strpos($_author, '-') === false ) {
+						$_author_array[] = absint( $_author );
+					}	
+				}
+			}
+			
+			$whichauthor .= " AND $wpdb->posts.post_author $op (" . implode(',', $_author_array) . ")";
 			unset($author_array, $_author_array);
 		}
 
