diff options
Diffstat (limited to 'includes')
-rw-r--r-- | includes/database/select.inc | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/includes/database/select.inc b/includes/database/select.inc index f3fd8368a..b071c7454 100644 --- a/includes/database/select.inc +++ b/includes/database/select.inc @@ -1250,17 +1250,19 @@ class SelectQuery extends Query implements SelectQueryInterface { // Create our new query object that we will mutate into a count query. $count = clone($this); - // Zero-out existing fields and expressions. - $fields =& $count->getFields(); - $fields = array(); - $expressions =& $count->getExpressions(); - $expressions = array(); - + if (!$count->distinct) { + // When not executing a distinct query, we can zero-out existing fields + // and expressions. + $fields =& $count->getFields(); + $fields = array(); + $expressions =& $count->getExpressions(); + $expressions = array(); - // Also remove 'all_fields' statements, which are expanded into tablename.* - // when the query is executed. - foreach ($count->tables as $alias => &$table) { - unset($table['all_fields']); + // Also remove 'all_fields' statements, which are expanded into tablename.* + // when the query is executed. + foreach ($count->tables as $alias => &$table) { + unset($table['all_fields']); + } } // Ordering a count query is a waste of cycles, and breaks on some @@ -1268,6 +1270,13 @@ class SelectQuery extends Query implements SelectQueryInterface { $orders = &$count->getOrderBy(); $orders = array(); + if ($count->distinct) { + // If the query is distinct, we need to execute it in a subquery, + // because SQL99 does not support counting on distinct multiple fields. + $count = db_select($count); + $count->distinct = FALSE; + } + // COUNT() is an expression, so we add that back in. $count->addExpression('COUNT(*)'); |