Index: src/wp-includes/user.php
===================================================================
--- src/wp-includes/user.php	(revision 39202)
+++ src/wp-includes/user.php	(working copy)
@@ -857,7 +857,7 @@
 		$select_count = implode(', ', $select_count);
 
 		// Add the meta_value index to the selection list, then run the query.
-		$row = $wpdb->get_row( "SELECT $select_count, COUNT(*) FROM $wpdb->usermeta WHERE meta_key = '{$blog_prefix}capabilities'", ARRAY_N );
+		$row = $wpdb->get_row( "SELECT $select_count, COUNT(*) FROM $wpdb->usermeta JOIN $wpdb->users ON user_id = ID WHERE meta_key = '{$blog_prefix}capabilities'", ARRAY_N );
 
 		// Run the previous loop again to associate results with role names.
 		$col = 0;
@@ -881,7 +881,7 @@
 			'none' => 0,
 		);
 
-		$users_of_blog = $wpdb->get_col( "SELECT meta_value FROM $wpdb->usermeta WHERE meta_key = '{$blog_prefix}capabilities'" );
+		$users_of_blog = $wpdb->get_col( "SELECT meta_value FROM $wpdb->usermeta JOIN $wpdb->users ON user_id = ID WHERE meta_key = '{$blog_prefix}capabilities'" );
 
 		foreach ( $users_of_blog as $caps_meta ) {
 			$b_roles = maybe_unserialize($caps_meta);
Index: tests/phpunit/tests/user/countUsers.php
===================================================================
--- tests/phpunit/tests/user/countUsers.php	(revision 39202)
+++ tests/phpunit/tests/user/countUsers.php	(working copy)
@@ -186,4 +186,29 @@
 		);
 	}
 
+	/**
+	 * @ticket 29785
+	 *
+	 * @dataProvider data_count_users_strategies
+	 */
+	public function test_should_not_count_users_who_are_not_in_posts_table( $strategy ) {
+		global $wpdb;
+
+		// Get a 'before' count for comparison.
+		$count = count_users( $strategy );
+
+		$u = self::factory()->user->create( array(
+			'role' => 'editor',
+		) );
+
+		// Manually delete the user, but leave the capabilities usermeta.
+		$wpdb->delete( $wpdb->users, array(
+			'ID' => $u,
+		) );
+
+		$count2 = count_users( $strategy );
+
+		$this->assertEqualSets( $count, $count2 );
+	}
+
 }
