diff --git src/wp-includes/comment-template.php src/wp-includes/comment-template.php
index 0d44376..9b102d4 100644
--- src/wp-includes/comment-template.php
+++ src/wp-includes/comment-template.php
@@ -1112,15 +1112,22 @@ function comments_template( $file = '/comments.php', $separate_comments = false
 	 */
 	$comment_author_url = esc_url($commenter['comment_author_url']);
 
-	/** @todo Use API instead of SELECTs. */
-	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));
+	$comment_args = array(
+		'order'   => 'ASC',
+		'orderby' => 'comment_date_gmt',
+		'status'  => 'approve',
+		'post_id' => $post->ID,
+	);
+
+	if ( $user_ID ) {
+		$comment_args['unapproved_user_id'] = $user_ID;
+	} else if ( ! empty( $comment_author ) ) {
+		$comment_args['unapproved_author'] = wp_specialchars_decode( $comment_author, ENT_QUOTES );
+		$comment_args['unapproved_author_email'] = $comment_author_email;
 	}
 
+	$comments = get_comments( $comment_args );
+
 	/**
 	 * Filter the comments array.
 	 *
diff --git src/wp-includes/comment.php src/wp-includes/comment.php
index 516c1eb..6ec3413 100644
--- src/wp-includes/comment.php
+++ src/wp-includes/comment.php
@@ -303,16 +303,34 @@ class WP_Comment_Query {
 			return $cache;
 		}
 
+		// Assemble clauses related to 'comment_approved'
+		$approved_clauses = array();
 		$status = $this->query_vars['status'];
 		if ( 'hold' == $status ) {
-			$approved = "comment_approved = '0'";
+			$approved_clauses[] = "comment_approved = '0'";
 		} elseif ( 'approve' == $status ) {
-			$approved = "comment_approved = '1'";
+			$approved_clauses[] = "comment_approved = '1'";
 		} elseif ( ! empty( $status ) && 'all' != $status ) {
-			$approved = $wpdb->prepare( "comment_approved = %s", $status );
+			$approved_clauses[] = $wpdb->prepare( "comment_approved = %s", $status );
 		} else {
-			$approved = "( comment_approved = '0' OR comment_approved = '1' )";
+			$approved_clauses[] = "( comment_approved = '0' OR comment_approved = '1' )";
 		}
+
+		if ( ! empty( $this->query_vars['unapproved_user_id'] ) ) {
+			$approved_clauses[] = $wpdb->prepare( "user_id = %d AND comment_approved = '0'", $this->query_vars['unapproved_user_id'] );
+		}
+
+		if ( ! empty( $this->query_vars['unapproved_author'] ) && ! empty( $this->query_vars['unapproved_author_email'] ) ) {
+			$approved_clauses[] = $wpdb->prepare( "comment_author = %s AND comment_author_email = %s AND comment_approved = '0'", $this->query_vars['unapproved_author'], $this->query_vars['unapproved_author_email'] );
+		}
+
+		// Collapse comment_approved clauses into a single OR-separated clause
+		if ( 1 === count( $approved_clauses ) ) {
+			$approved = $approved_clauses[0];
+		} else {
+			$approved = '( ' . implode( ' OR ', $approved_clauses ) . ' )';
+		}
+
 		$order = ( 'ASC' == strtoupper( $this->query_vars['order'] ) ) ? 'ASC' : 'DESC';
 
 		if ( ! empty( $this->query_vars['orderby'] ) ) {
diff --git tests/phpunit/tests/comment/query.php tests/phpunit/tests/comment/query.php
index 51140a7..d471842 100644
--- tests/phpunit/tests/comment/query.php
+++ tests/phpunit/tests/comment/query.php
@@ -198,4 +198,61 @@ class Tests_Comment_Query extends WP_UnitTestCase {
 		$this->assertCount( 3, $comment_ids );
 		$this->assertEqualSets( array( $comment_1, $comment_2, $comment_3 ), $comment_ids );
 	}
+
+	public function test_get_comments_with_status_all() {
+		$comment_1 = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id, 'user_id' => 7, 'comment_approved' => '1' ) );
+		$comment_2 = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id, 'user_id' => 1, 'comment_approved' => '1' ) );
+		$comment_3 = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id, 'user_id' => 1, 'comment_approved' => '0' ) );
+		$comments_approved_1 = get_comments( array( 'status' => 'all' ) );
+
+		$comment_ids = get_comments( array( 'fields' => 'ids' ) );
+		$this->assertEqualSets( array( $comment_1, $comment_2, $comment_3 ), $comment_ids );
+	}
+
+	public function test_get_comments_with_unapproved_user_id() {
+		$comment_1 = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id, 'user_id' => 7, 'comment_approved' => '1' ) );
+		$comment_2 = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id, 'user_id' => 1, 'comment_approved' => '1' ) );
+		$comment_3 = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id, 'user_id' => 1, 'comment_approved' => '0' ) );
+
+		// With unapproved user id
+		$comment_ids_1 = get_comments( array(
+			'fields' => 'ids',
+			'unapproved_user_id' => 1,
+			'status' => 'approve',
+		) );
+
+		$this->assertEqualSets( array( $comment_1, $comment_2, $comment_3 ), $comment_ids_1 );
+
+		// Without unapproved user id
+		$comment_ids_2 = get_comments( array(
+			'fields' => 'ids',
+			'status' => 'approve',
+		) );
+
+		$this->assertEqualSets( array( $comment_1, $comment_2 ), $comment_ids_2 );
+	}
+
+	public function test_get_comments_with_unapproved_author_and_unapproved_author_email() {
+		$comment_1 = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id, 'user_id' => 7, 'comment_approved' => '1' ) );
+		$comment_2 = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id, 'user_id' => 0, 'comment_approved' => '1', 'comment_author' => 'foo', 'comment_author_email' => 'foo@example.com' ) );
+		$comment_3 = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id, 'user_id' => 0, 'comment_approved' => '0', 'comment_author' => 'foo', 'comment_author_email' => 'foo@example.com' ) );
+
+		// With unapproved author/email
+		$comment_ids_1 = get_comments( array(
+			'fields' => 'ids',
+			'unapproved_author' => 'foo',
+			'unapproved_author_email' => 'foo@example.com',
+			'status' => 'approve',
+		) );
+
+		$this->assertEqualSets( array( $comment_1, $comment_2, $comment_3 ), $comment_ids_1 );
+
+		// Without unapproved author/email
+		$comment_ids_2 = get_comments( array(
+			'fields' => 'ids',
+			'status' => 'approve',
+		) );
+
+		$this->assertEqualSets( array( $comment_1, $comment_2 ), $comment_ids_2 );
+	}
 }
