The Users view generates JOINS not needed, and when you use in the filter more than once the same field, the result is wrong. For instance, if you create a users view and filter it by an specific role twice, the result brings no record.

The code to create the example view:

$view = new view();
$view->name = 'filter_error';
$view->description = '';
$view->tag = 'default';
$view->base_table = 'users';
$view->human_name = 'filter_error';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

/* Display: Master */
$handler = $view->new_display('default', 'Master', 'default');
$handler->display->display_options['title'] = 'filter_error';
$handler->display->display_options['use_more_always'] = FALSE;
$handler->display->display_options['use_more_text'] = 'more';
$handler->display->display_options['access']['type'] = 'perm';
$handler->display->display_options['access']['perm'] = 'access user profiles';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['exposed_form']['options']['submit_button'] = 'Submit';
$handler->display->display_options['exposed_form']['options']['reset_button_label'] = 'Reset';
$handler->display->display_options['exposed_form']['options']['exposed_sorts_label'] = 'Sort';
$handler->display->display_options['pager']['type'] = 'none';
$handler->display->display_options['pager']['options']['offset'] = '0';
$handler->display->display_options['style_plugin'] = 'default';
$handler->display->display_options['row_plugin'] = 'fields';
/* Field: User: Name */
$handler->display->display_options['fields']['name']['id'] = 'name';
$handler->display->display_options['fields']['name']['table'] = 'users';
$handler->display->display_options['fields']['name']['field'] = 'name';
$handler->display->display_options['fields']['name']['label'] = '';
$handler->display->display_options['fields']['name']['alter']['word_boundary'] = FALSE;
$handler->display->display_options['fields']['name']['alter']['ellipsis'] = FALSE;
$handler->display->display_options['filter_groups']['operator'] = 'OR';
/* Filters: User: Roles */
$handler->display->display_options['filters']['rid']['id'] = 'rid';
$handler->display->display_options['filters']['rid']['table'] = 'users_roles';
$handler->display->display_options['filters']['rid']['field'] = 'rid';
$handler->display->display_options['filters']['rid']['value'] = array(
  3 => '3',
);
$handler->display->display_options['filters']['rid']['group'] = 1;
/*Filters: User: Roles */
$handler->display->display_options['filters']['rid_1']['id'] = 'rid_1';
$handler->display->display_options['filters']['rid_1']['table'] = 'users_roles';
$handler->display->display_options['filters']['rid_1']['field'] = 'rid';
$handler->display->display_options['filters']['rid_1']['value'] = array(
  3 => '3',
);

/* Display: Page */
$handler = $view->new_display('page', 'Page', 'page');
$handler->display->display_options['path'] = 'filter-error';

The generated query:

SELECT users.name AS users_name, users.uid AS uid
FROM 
{users} users
INNER JOIN {users_roles} users_roles ON users.uid = users_roles.uid
LEFT JOIN {users_roles} users_roles2 ON users.uid = users_roles2.uid AND users_roles2.rid != '3'
WHERE (( (users_roles.rid = '3') AND (users_roles2.rid = '3') ))

The JOINS are not necessary, but still could be right. The wrong code here is the last AND in the LEFT JOIN: AND users_roles2.rid != '3'

Comments

fpap created an issue. See original summary.

fpap’s picture

Status: Active » Needs work
MustangGB’s picture

Priority: Critical » Normal
Status: Needs work » Active