Index: wp-includes/user.php
===================================================================
--- wp-includes/user.php	(revision 17061)
+++ wp-includes/user.php	(working copy)
@@ -481,10 +481,19 @@
 			$this->query_where .= $this->get_search_sql( $search, $search_columns, $wild );
 		}
 
+		$blog_id = absint( $qv['blog_id'] );
+
+		// @todo This should use get_meta_sql() once it handles 0 as a meta_value. See #15871
+		if ( 'authors' == $qv['who'] && $blog_id ) {
+			$qv['meta_key'] = $wpdb->get_blog_prefix( $blog_id ) . 'user_level';
+			$qv['meta_value'] = '_wp_zero_value'; // Hack to pass '0'
+			$qv['meta_compare'] = '!=';
+			$qv['blog_id'] = $blog_id = 0; // Prevent extra meta query
+		}
+
 		_parse_meta_query( $qv );
 
 		$role = trim( $qv['role'] );
-		$blog_id = absint( $qv['blog_id'] );
 
 		if ( $blog_id && ( $role || is_multisite() ) ) {
 			$cap_meta_query = array();
@@ -949,6 +958,7 @@
  * <ol>
  * <li>show_option_all - Text to show all and whether HTML option exists.</li>
  * <li>show_option_none - Text for show none and whether HTML option exists.</li>
+ * <li>show_option_gt_one - Generate the dropdown only if more than one user is listed.</li>
  * <li>orderby - SQL order by clause for what order the users appear. Default is 'display_name'.</li>
  * <li>order - Default is 'ASC'. Can also be 'DESC'.</li>
  * <li>include - User IDs to include.</li>
@@ -961,6 +971,7 @@
  * <li>id - Default is the value of the 'name' parameter. ID attribute of select element.</li>
  * <li>class - Class attribute of select element.</li>
  * <li>blog_id - ID of blog (Multisite only). Defaults to ID of current blog.</li>
+ * <li>who - Which users to query.  Currently only 'authors' is supported. Default is all users.</li>
  * </ol>
  *
  * @since 2.3.0
@@ -970,14 +981,13 @@
  * @return string|null Null on display. String of HTML content on retrieve.
  */
 function wp_dropdown_users( $args = '' ) {
-	global $wpdb;
 	$defaults = array(
-		'show_option_all' => '', 'show_option_none' => '',
+		'show_option_all' => '', 'show_option_none' => '', 'show_option_gt_one' => '',
 		'orderby' => 'display_name', 'order' => 'ASC',
 		'include' => '', 'exclude' => '', 'multi' => 0,
 		'show' => 'display_name', 'echo' => 1,
-		'selected' => 0, 'name' => 'user', 'class' => '', 'blog_id' => $GLOBALS['blog_id'],
-		'id' => '',
+		'selected' => 0, 'name' => 'user', 'class' => '', 'id' => '',
+		'blog_id' => $GLOBALS['blog_id'], 'who' => ''
 	);
 
 	$defaults['selected'] = is_author() ? get_query_var( 'author' ) : 0;
@@ -985,13 +995,12 @@
 	$r = wp_parse_args( $args, $defaults );
 	extract( $r, EXTR_SKIP );
 
-	$query_args = wp_array_slice_assoc( $r, array( 'blog_id', 'include', 'exclude', 'orderby', 'order' ) );
+	$query_args = wp_array_slice_assoc( $r, array( 'blog_id', 'include', 'exclude', 'orderby', 'order', 'who' ) );
 	$query_args['fields'] = array( 'ID', $show );
-
 	$users = get_users( $query_args );
 
 	$output = '';
-	if ( !empty($users) ) {
+	if ( !empty($users) && ( empty($show_option_gt_one) || count($users) > 1 ) ) {
 		$name = esc_attr( $name );
 		if ( $multi && ! $id )
 			$id = '';
Index: wp-includes/meta.php
===================================================================
--- wp-includes/meta.php	(revision 17061)
+++ wp-includes/meta.php	(working copy)
@@ -433,6 +433,11 @@
 		} else {
 			$meta_compare_string = '%s';
 		}
+
+		// @todo Temporary hack to support empty values. Do not use outside of core.
+		if ( '_wp_zero_value' == $meta_value )
+			$meta_value = 0;
+
 		$where .= $wpdb->prepare( " AND CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string}", $meta_value );
 	}
 
Index: wp-admin/includes/class-wp-posts-list-table.php
===================================================================
--- wp-admin/includes/class-wp-posts-list-table.php	(revision 17061)
+++ wp-admin/includes/class-wp-posts-list-table.php	(working copy)
@@ -757,7 +757,6 @@
 				<?php touch_time( 1, 1, 4, 1 ); ?>
 			</div>
 			<br class="clear" />
-
 	<?php endif; // $bulk
 
 		if ( post_type_supports( $screen->post_type, 'author' ) ) :
@@ -765,6 +764,8 @@
 
 			if ( is_super_admin() || current_user_can( $post_type_object->cap->edit_others_posts ) ) :
 				$users_opt = array(
+					'show_option_gt_one' => true,
+					'who' => 'authors',
 					'name' => 'post_author',
 					'class'=> 'authors',
 					'multi' => 1,
@@ -772,10 +773,13 @@
 				);
 				if ( $bulk )
 					$users_opt['show_option_none'] = __( '&mdash; No Change &mdash;' );
-				$authors_dropdown  = '<label>';
-				$authors_dropdown .= '<span class="title">' . __( 'Author' ) . '</span>';
-				$authors_dropdown .= wp_dropdown_users( $users_opt );
-				$authors_dropdown .= '</label>';
+
+				if ( $authors = wp_dropdown_users( $users_opt ) ) :
+					$authors_dropdown  = '<label>';
+					$authors_dropdown .= '<span class="title">' . __( 'Author' ) . '</span>';
+					$authors_dropdown .= $authors;
+					$authors_dropdown .= '</label>';
+				endif;
 			endif; // authors
 	?>
 
Index: wp-admin/includes/meta-boxes.php
===================================================================
--- wp-admin/includes/meta-boxes.php	(revision 17061)
+++ wp-admin/includes/meta-boxes.php	(working copy)
@@ -530,11 +530,11 @@
  */
 function post_author_meta_box($post) {
 	global $user_ID;
-
 ?>
 <label class="screen-reader-text" for="post_author_override"><?php _e('Author'); ?></label>
 <?php
 	wp_dropdown_users( array(
+		'who' => 'authors',
 		'name' => 'post_author_override',
 		'selected' => empty($post->ID) ? $user_ID : $post->post_author
 	) );
