}
/**
- * @inheritdoc
+ * @inheritDoc
*/
protected function doMainQuery( $tables, $select, $conds, $query_options,
$join_conds, FormOptions $opts
$join_conds['page'] = [ 'LEFT JOIN', 'rc_cur_id=page_id' ];
$select[] = 'page_latest';
}
+
+ $tagFilter = $opts['tagfilter'] ? explode( '|', $opts['tagfilter'] ) : [];
ChangeTags::modifyDisplayQuery(
$tables,
$select,
$conds,
$join_conds,
$query_options,
- $opts['tagfilter']
+ $tagFilter
);
+ if ( $dbr->unionSupportsOrderAndLimit() ) {
+ if ( count( $tagFilter ) > 1 ) {
+ // ChangeTags::modifyDisplayQuery() will have added DISTINCT.
+ // To prevent this from causing query performance problems, we need to add
+ // a GROUP BY, and add rc_id to the ORDER BY.
+ $order = [
+ 'GROUP BY' => 'rc_timestamp, rc_id',
+ 'ORDER BY' => 'rc_timestamp DESC, rc_id DESC'
+ ];
+ } else {
+ $order = [ 'ORDER BY' => 'rc_timestamp DESC' ];
+ }
+ } else {
+ $order = [];
+ }
+
if ( !$this->runMainQueryHook( $tables, $select, $conds, $query_options, $join_conds,
$opts )
) {
}
}
- if ( $dbr->unionSupportsOrderAndLimit() ) {
- $order = [ 'ORDER BY' => 'rc_timestamp DESC' ];
- } else {
- $order = [];
- }
-
$query = $dbr->selectSQLText(
array_merge( $tables, [ $link_table ] ),
$select,