+++ Introduction

Record collections can be sorted efficiently at the database level using the ORDER BY clause.

Syntax:

<code>
        [ORDER BY {ComponentAlias.columnName}
        [ASC | DESC], ...]
</code>

Examples:

<code>
FROM User u LEFT JOIN u.Phonenumber p
  ORDER BY u.name, p.phonenumber

FROM User u, u.Email e
  ORDER BY e.address, u.id
</code>

In order to sort in reverse order you can add the DESC (descending) keyword to the name of the column in the ORDER BY clause that you are sorting by. The default is ascending order; this can be specified explicitly using the ASC keyword. 

<code>
FROM User u LEFT JOIN u.Email e
  ORDER BY e.address DESC, u.id ASC;
</code>


+++ Sorting by an aggregate value

In the following example we fetch all users and sort those users by the number of phonenumbers they have.

<code type="php">
$q = new Doctrine_Query();

$users = $q->select('u.*, COUNT(p.id) count')
           ->from('User u')
           ->innerJoin('u.Phonenumber p')
           ->orderby('count');
</code>

+++ Using random order

In the following example we use random in the ORDER BY clause in order to fetch random post.

<code type="php">
$q = new Doctrine_Query();

$posts = $q->select('p.*, RANDOM() rand')
           ->from('Post p')
           ->orderby('rand')
           ->limit(1)
           ->execute();

$randomPost = $posts[0];
</code>

