Index: wp-admin/includes/class-wp-users-list-table.php
===================================================================
--- wp-admin/includes/class-wp-users-list-table.php	(revision 18569)
+++ wp-admin/includes/class-wp-users-list-table.php	(working copy)
@@ -178,6 +178,7 @@
 			'username' => 'login',
 			'name'     => 'name',
 			'email'    => 'email',
+			'posts'    => 'post_count'
 		);
 
 		if ( $this->is_site_users )
Index: wp-includes/user.php
===================================================================
--- wp-includes/user.php	(revision 18569)
+++ wp-includes/user.php	(working copy)
@@ -426,6 +426,12 @@
 		$this->query_where = "WHERE 1=1";
 
 		// sorting
+		$qv['order'] = strtoupper( $qv['order'] );
+		if ( 'ASC' == $qv['order'] )
+			$order = 'ASC';
+		else
+			$order = 'DESC';
+
 		if ( in_array( $qv['orderby'], array('nicename', 'email', 'url', 'registered') ) ) {
 			$orderby = 'user_' . $qv['orderby'];
 		} elseif ( in_array( $qv['orderby'], array('user_nicename', 'user_email', 'user_url', 'user_registered') ) ) {
@@ -433,31 +439,23 @@
 		} elseif ( 'name' == $qv['orderby'] || 'display_name' == $qv['orderby'] ) {
 			$orderby = 'display_name';
 		} elseif ( 'post_count' == $qv['orderby'] ) {
-			// todo: avoid the JOIN
 			$where = get_posts_by_author_sql('post');
-			$this->query_from .= " LEFT OUTER JOIN (
-				SELECT post_author, COUNT(*) as post_count
-				FROM $wpdb->posts
-				$where
-				GROUP BY post_author
-			) p ON ({$wpdb->users}.ID = p.post_author)
-			";
-			$orderby = 'post_count';
+			$this->post_authors_query = "SELECT post_author FROM $wpdb->posts $where GROUP BY post_author ORDER BY COUNT(ID) $order";
+
+			if ( false === strpos( $this->query_fields, 'ID' ) && false === strpos( $this->query_fields, '*' ) )
+				$this->query_fields .= ", $wpdb->users.ID";
+
+			$orderby = '';
 		} elseif ( 'ID' == $qv['orderby'] || 'id' == $qv['orderby'] ) {
 			$orderby = 'ID';
 		} else {
 			$orderby = 'user_login';
 		}
 
-		$qv['order'] = strtoupper( $qv['order'] );
-		if ( 'ASC' == $qv['order'] )
-			$order = 'ASC';
-		else
-			$order = 'DESC';
-		$this->query_orderby = "ORDER BY $orderby $order";
+		$this->query_orderby = ( !empty($orderby) ) ? "ORDER BY $orderby $order" : '';
 
 		// limit
-		if ( $qv['number'] ) {
+		if ( $qv['number'] && 'post_count' !== $qv['orderby'] ) {
 			if ( $qv['offset'] )
 				$this->query_limit = $wpdb->prepare("LIMIT %d, %d", $qv['offset'], $qv['number']);
 			else
@@ -558,6 +556,9 @@
 		if ( !$this->results )
 			return;
 
+		if ( 'post_count' == $this->query_vars['orderby'] )
+			$this->_sort_by_post_count();
+
 		if ( 'all_with_meta' == $this->query_vars['fields'] ) {
 			cache_users( $this->results );
 
@@ -620,6 +621,58 @@
 	function get_total() {
 		return $this->total_users;
 	}
+
+	/**
+	 * Sort found users by post count
+	 *
+	 * @access private
+	 */
+	function _sort_by_post_count() {
+		global $wpdb;
+
+		$post_authors = $wpdb->get_col( $this->post_authors_query );
+
+		if ( empty( $post_authors ) )
+			return;
+
+		if ( 'DESC' == $this->query_vars['order'] )
+			$post_authors = array_reverse( $post_authors );
+
+		if ( is_object( $this->results[0] ) ) {
+			foreach ( $post_authors as $post_author ) {
+				$user_in_current_view = false;
+				foreach ( $this->results as $key => $user ) {
+					if ( $user->ID == $post_author ) {
+						$user_in_current_view = true;
+						break;
+					}
+				}
+
+				if ( $user_in_current_view ) {
+					unset( $this->results[$key] );
+
+					if ( 'DESC' == $this->query_vars['order'] )
+						array_unshift( $this->results, $user );
+					else
+						array_push( $this->results, $user );
+				}
+			}
+		} else {
+			foreach ( $post_authors as $post_author ) {
+				if ( false !== ( $key = array_search( $post_author, $this->results ) ) ) {
+					unset( $this->results[$key] );
+
+					if ( 'DESC' == $this->query_vars['order'] )
+						array_unshift( $this->results, $post_author );
+					else
+						array_push( $this->results, $post_author );
+				}
+			}
+		}
+
+		if ( '' !== $this->query_vars['offset'] && '' !== $this->query_vars['number'] )
+			$this->results = array_slice( $this->results, $this->query_vars['offset'], $this->query_vars['number'] );
+	}
 }
 
 /**
