summaryrefslogtreecommitdiff
path: root/includes/database
diff options
context:
space:
mode:
Diffstat (limited to 'includes/database')
-rw-r--r--includes/database/select.inc29
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(*)');