Index: src/wp-includes/comment.php
===================================================================
--- src/wp-includes/comment.php	(revision 29747)
+++ src/wp-includes/comment.php	(working copy)
@@ -303,16 +303,24 @@
 			return $cache;
 		}
 
-		$status = $this->query_vars['status'];
-		if ( 'hold' == $status ) {
-			$approved = "comment_approved = '0'";
-		} elseif ( 'approve' == $status ) {
-			$approved = "comment_approved = '1'";
-		} elseif ( ! empty( $status ) && 'all' != $status ) {
-			$approved = $wpdb->prepare( "comment_approved = %s", $status );
-		} else {
-			$approved = "( comment_approved = '0' OR comment_approved = '1' )";
+		$status_queries = array();
+		$statuses       = empty( $this->query_vars['status'] ) ? array( 'all' ) : (array) $this->query_vars['status'];
+
+		foreach ( $statuses as $s ) {
+			if ( 'hold' == $s || '0' == $s ) {
+				$status_queries['hold'] = "comment_approved = '0'";
+			} elseif ( 'approve' == $s  || '1' == $s ) {
+				$status_queries['approve'] = "comment_approved = '1'";
+			} elseif ( 'all' == $s ) {
+				$status_queries['hold'] = "comment_approved = '0'";
+				$status_queries['approve'] = "comment_approved = '1'";
+			} else  {
+				$status_queries[ $s ] = $wpdb->prepare( "comment_approved = %s", $s );
+			}
 		}
+
+		$approved = "( " . implode( " OR ", $status_queries ) . " )";
+
 		$order = ( 'ASC' == strtoupper( $this->query_vars['order'] ) ) ? 'ASC' : 'DESC';
 
 		if ( ! empty( $this->query_vars['orderby'] ) ) {
Index: tests/phpunit/tests/comment/query.php
===================================================================
--- tests/phpunit/tests/comment/query.php	(revision 29747)
+++ tests/phpunit/tests/comment/query.php	(working copy)
@@ -16,6 +16,61 @@
 	}
 
 	/**
+	 * @ticket 29612
+	 */
+	function test_get_comments_by_status_array_3() {
+		$approved_comment_id = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id ) );
+
+		$trashed_comment_id  = $this->factory->comment->create(
+			array(
+				'comment_post_ID'  => $this->post_id,
+				'comment_approved' => 'trash'
+			)
+		);
+
+		$hold_comment_id = $this->factory->comment->create(
+			array(
+				'comment_post_ID'  => $this->post_id,
+				'comment_approved' => 0
+			)
+		);
+
+		$comments_by_array = get_comments(
+			array(
+				'status' => array( 'approve', 'hold', 'trash' )
+			)
+		);
+
+		$this->assertEquals( 3, count( $comments_by_array ) );
+	}
+
+	function test_get_comments_by_status_array_2() {
+		$approved_comment_id = $this->factory->comment->create( array( 'comment_post_ID' => $this->post_id ) );
+
+		$trashed_comment_id  = $this->factory->comment->create(
+			array(
+				'comment_post_ID'  => $this->post_id,
+				'comment_approved' => 'trash'
+			)
+		);
+
+		$hold_comment_id = $this->factory->comment->create(
+			array(
+				'comment_post_ID'  => $this->post_id,
+				'comment_approved' => 0
+			)
+		);
+
+		$comments_by_array = get_comments(
+			array(
+				'status' => array( 'approve', 'hold' )
+			)
+		);
+
+		$this->assertEquals( 2, count( $comments_by_array ) );
+	}
+
+	/**
 	 * @ticket 21101
 	 */
 	function test_get_comment_comment_approved_0() {
