Support for Drupal 7 is ending on 5 January 2025—it’s time to migrate to Drupal 10! Learn about the many benefits of Drupal 10 and find migration tools in our resource center.
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
Comment #2
fpap CreditAttribution: fpap commentedComment #3
MustangGB CreditAttribution: MustangGB commented