diff -r af4ea8657bd3 lib/sqlalchemy/orm/query.py
--- a/lib/sqlalchemy/orm/query.py	Mon Jun 06 22:24:50 2011 -0400
+++ b/lib/sqlalchemy/orm/query.py	Wed Jun 08 01:49:27 2011 -0400
@@ -2466,7 +2466,7 @@
             if context.order_by:
                 order_by_col_expr = list(
                                         chain(*[
-                                            sql_util.find_columns(o) 
+                                            sql_util.unwrap_order_by(o) 
                                             for o in context.order_by
                                         ])
                                     )
@@ -2480,6 +2480,9 @@
                         from_obj=froms,
                         use_labels=labels,
                         correlate=False,
+                        # TODO: this order_by is only needed if 
+                        # LIMIT/OFFSET is present in self._select_args,
+                        # else the application on the outside is enough
                         order_by=context.order_by,
                         **self._select_args
                     )
@@ -2527,7 +2530,7 @@
             if self._distinct and context.order_by:
                 order_by_col_expr = list(
                                         chain(*[
-                                            sql_util.find_columns(o) 
+                                            sql_util.unwrap_order_by(o) 
                                             for o in context.order_by
                                         ])
                                     )
diff -r af4ea8657bd3 lib/sqlalchemy/sql/operators.py
--- a/lib/sqlalchemy/sql/operators.py	Mon Jun 06 22:24:50 2011 -0400
+++ b/lib/sqlalchemy/sql/operators.py	Wed Jun 08 01:49:27 2011 -0400
@@ -524,6 +524,10 @@
 def is_commutative(op):
     return op in _commutative
 
+def is_ordering_modifier(op):
+    return op in (asc_op, desc_op, 
+                    nullsfirst_op, nullslast_op)
+
 _associative = _commutative.union([concat_op, and_, or_])
 
 
diff -r af4ea8657bd3 lib/sqlalchemy/sql/util.py
--- a/lib/sqlalchemy/sql/util.py	Mon Jun 06 22:24:50 2011 -0400
+++ b/lib/sqlalchemy/sql/util.py	Wed Jun 08 01:49:27 2011 -0400
@@ -8,6 +8,7 @@
 from sqlalchemy.util import topological
 from sqlalchemy.sql import expression, operators, visitors
 from itertools import chain
+from collections import deque
 
 """Utility functions that build upon SQL and Schema constructs."""
 
@@ -99,6 +100,25 @@
     visitors.traverse(clause, {}, {'column':cols.add})
     return cols
 
+def unwrap_order_by(clause):
+    """Break up an 'order by' expression into individual column-expressions,
+    without DESC/ASC/NULLS FIRST/NULLS LAST"""
+
+    cols = util.column_set()
+    stack = deque([clause])
+    while stack:
+        t = stack.popleft()
+        if isinstance(t, expression.ColumnElement) and \
+            (
+                not isinstance(t, expression._UnaryExpression) or \
+                not operators.is_ordering_modifier(t.modifier)
+            ): 
+            cols.add(t)
+        else:
+            for c in t.get_children():
+                stack.append(c)
+    return cols
+
 def clause_is_present(clause, search):
     """Given a target clause and a second to search within, return True
     if the target is plainly present in the search without any
