Index: wp-includes/comment.php
===================================================================
--- wp-includes/comment.php	(revision 21304)
+++ wp-includes/comment.php	(working copy)
@@ -212,7 +212,8 @@
 			'order' => 'DESC',
 			'parent' => '',
 			'post_ID' => '',
-			'post_id' => 0,
+			'post_id' => '',
+			'post__in' => '',
 			'post_author' => '',
 			'post_name' => '',
 			'post_parent' => '',
@@ -220,6 +221,9 @@
 			'post_type' => '',
 			'status' => '',
 			'type' => '',
+			'unapproved_author' => '',
+			'unapproved_author_email' => '',
+			'unapproved_user_id' => '',
 			'user_id' => '',
 			'search' => '',
 			'count' => false
@@ -242,6 +246,9 @@
 			return $cache;
 		}
 
+		if ( empty( $post_id ) && empty( $post__in ) )
+			$post_id = 0;
+
 		$post_id = absint($post_id);
 
 		if ( 'hold' == $status )
@@ -255,6 +262,19 @@
 		else
 			$approved = "( comment_approved = '0' OR comment_approved = '1' )";
 
+		$where = $approved;
+
+		if ( ( '' != $unapproved_user_id || '' !== $unapproved_author || '' != $unapproved_author_email ) ) {
+			$where = '( ' . $where . ' OR ( comment_approved = 0 ';
+			if ( '' !== $unapproved_author )
+				$where .= $wpdb->prepare( ' AND comment_author = %s', $unapproved_author );
+			if ( '' !== $unapproved_author_email )
+				$where .= $wpdb->prepare( ' AND comment_author_email = %s', $unapproved_author_email );
+			if ( '' !== $unapproved_user_id )
+				$where .= $wpdb->prepare( ' AND user_id = %d', $unapproved_user_id );
+			$where .= ' ) ) ';
+		}
+		
 		$order = ( 'ASC' == strtoupper($order) ) ? 'ASC' : 'DESC';
 
 		if ( ! empty( $orderby ) ) {
@@ -302,10 +322,13 @@
 			$fields = '*';
 
 		$join = '';
-		$where = $approved;
 
 		if ( ! empty($post_id) )
 			$where .= $wpdb->prepare( ' AND comment_post_ID = %d', $post_id );
+		if ( '' != $post__in && is_array($post__in) && !empty($post__in) ) {
+			$_post__in = implode(',', array_map( 'absint', $post__in ));
+			$where .= " AND comment_post_ID IN ($_post__in)";
+		}
 		if ( '' !== $author_email )
 			$where .= $wpdb->prepare( ' AND comment_author_email = %s', $author_email );
 		if ( '' !== $karma )
Index: wp-includes/comment-template.php
===================================================================
--- wp-includes/comment-template.php	(revision 21304)
+++ wp-includes/comment-template.php	(working copy)
@@ -881,14 +881,18 @@
 	 */
 	$comment_author_url = esc_url($commenter['comment_author_url']);
 
-	/** @todo Use API instead of SELECTs. */
+	$args = array(
+		'order' => 'ASC',
+		'post_id' => $post->ID, 
+		'status' => 'approve'
+	);
 	if ( $user_ID) {
-		$comments = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND (comment_approved = '1' OR ( user_id = %d AND comment_approved = '0' ) )  ORDER BY comment_date_gmt", $post->ID, $user_ID));
-	} else if ( empty($comment_author) ) {
-		$comments = get_comments( array('post_id' => $post->ID, 'status' => 'approve', 'order' => 'ASC') );
-	} else {
-		$comments = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND ( comment_approved = '1' OR ( comment_author = %s AND comment_author_email = %s AND comment_approved = '0' ) ) ORDER BY comment_date_gmt", $post->ID, wp_specialchars_decode($comment_author,ENT_QUOTES), $comment_author_email));
+		$args[ 'unapproved_user_id' ] = $user_ID;
+	} else if ( ! empty($comment_author) ) {
+		$args[ 'unapproved_author' ] = wp_specialchars_decode($comment_author,ENT_QUOTES);
+		$args[ 'unapproved_author_email' ] = $comment_author_email;
 	}
+	$comments = get_comments( $args );
 
 	// keep $comments for legacy's sake
 	$wp_query->comments = apply_filters( 'comments_array', $comments, $post->ID );
